Moderator: ago



In realtà l'informazione era già contenuta nel 9! perché hai il prodotto di 9 termini, uno dei quali uguale a 1.skypjack wrote:Mmm... Questa affermazione effettivamente può tornare utile.makoomba wrote:01234567 è equivalente a 012345678 perchè l'ultima cifra, essendo "obbligata", non aggiunge alcuna informazione.
Ora penso come, alleggerisce i calcoli in ogni caso di un fattore 1/9 se non altro...![]()
Thanks!!

Ho aggiornato il post precedente, praticamente devi pensare a 9! numeri in fila ognuno dei quali corrisponde a una permutazione. Si tratta solo di ordinarle in modo intelligente. Una cosa intelligente può essere quella di dividere i 9! numeri in 9 blocchi ognuno con un numero diverso (da 0 a 8 ) all'inizio. Poi ogni blocco è formato da 8! elementi che puoi ordinare anch'essi.skypjack wrote:E se ho 9 elementi come mi muovo?
Non ho seguito bene il tuo ragionamento, forse l'ora tarda e la sveglia mattutina...
Puoi spiegarmi?

Code: Select all
using namespace std;
#include <iostream>
#define N 9
int alfabeto[N+1] = { 0 };
long long int fatt[N+1] = { 1 };
int main( )
{
long long int rank;
cin >> rank;
for (int i=1; i<=N; i++)
fatt[i] = i * fatt[i-1];
for (int i=N; i>0; i--) {
long long int k = ((rank-1) / fatt[i-1]) + 1;
for (int j=1; j<=N; j++) {
if (alfabeto[j] == 0)
k--;
if (k == 0) {
cout << j << endl;
alfabeto[j] = 1;
break;
}
}
rank = (rank - 1) % fatt[i-1] + 1;
}
}
Code: Select all
using namespace std;
#include <iostream>
#define N 9
int alfabeto[N+1] = { 0 };
long long int fatt[N+1] = { 1 };
int main( )
{
long long int rank = 0;
for (int i=1; i<=N; i++)
fatt[i] = i * fatt[i-1];
for (int i=N; i>0; i--) {
int c, k = 0;
cin >> c;
for (int j=1; j<=c; j++) {
if (alfabeto[j] == 0)
k++;
}
alfabeto[c] = 1;
rank += (k-1) * fatt[i-1];
}
rank++;
cout << rank << endl;
}

Beh.. la mia calcolatricina il fattoriale di 8 lo calcola in una frazione di secondo.skypjack wrote:Il fatto è che si lavora con fattoriali e con matematica "non precisa", questo non è possibile. Mi spiace.
Se si tratta di alzare il calcolo computazionale e l'occupazione di memoria, preferisco calcolare un long come somma di potenze crescenti del dieci moltiplicate per i valori presenti nel vettore, traendo dal suggerimento sopra posso limitarmi poi ai primi 8 valori. Con calcolo modulare su tali valori, poi, riempio un hash di, per esempio, di celle.
Cercavo qualcosa di più semplice e immediato, ma confermate quanto avevo dedotto: non esiste!!
