#include #include #include #include #include #include #include int maxN = 1000000; int *primes,num_primes; int small[7+1] = {0,1,3,4,7,6,10,8}; //Simple prime sieve-generation up to x. int gen_primes(int **primes,int x){ int max_num,num_p,p,kp,i; char *A; A = (char *) malloc((x+1) * sizeof(char)); max_num = (int)floor(sqrt((double)x)); num_p = 1; for(i=3;i<=x;i+=2) A[i] = 1; A[x] = x%2; for(p=3;p<=x;p+=2){ if(A[p]){ num_p++; if(p<=max_num){ kp = p*p; while(kp<=x){ A[kp]=0; kp+=p; } } } } *primes = (int *) malloc(num_p * sizeof(int)); (*primes)[0] = 2; for(i=1,p=3;p<=x;p+=2){ if(A[p]) (*primes)[i++] = p; } free(A); return num_p; } long int longestSequence(int size, long int* a) { // Return the length of the longest possible sequence of moves. long int sum; long int fact[64],mul[64],numf,max_p; long int u,v; int i,j,k; sum = 0; for(i=0;i v: %ld\n",primes[j],v); while((v%primes[j])==0){ v/=primes[j]; mul[numf]++; } numf++; } if(v==1) break; } // if(v!=1){ fact[numf] = v; mul[numf++] = 1; } u = 1; v = 1; for(j=numf-1;j>=0;j--){ for(k=0;k