|
|
вернуться в форум#include<stdio.h> #include<math.h> #include<map> using namespace std; map<unsigned long long,int> M;
int Prime[30]={0,2,3,5,7},Pct=5; void genprime(int); int expP[30]={70},solVal[500],ctsol; unsigned long long solKey[500]; void gensol(unsigned long long,int); void arrange(); main() { genprime(30); gensol(1,1); arrange(); //for (int i=1;i<=ctsol;i++) printf("%lld %d\n",solKey[i],solVal[i]); int Test,id; unsigned long long n; scanf("%d",&Test); for (int t=1;t<=Test;t++) { scanf("%llu",&n); id=ctsol; while (solKey[id]>n) id--; printf("%llu %d\n",solKey[id],solVal[id]); } } void genprime(int K) { int i,j; for (i=11;Pct<K;i+=2) { for (j=1;Prime[j]*Prime[j]<=i;j++) if (i%Prime[j]==0) break; if (Prime[j]*Prime[j]>i) Prime[Pct++]=i; } //for (int i=1;i<Pct;i++) printf("%d\t",Prime[i]); } void gensol(unsigned long long x,int pID) { int i,pro=1; for (i=1;i<30;i++) pro*=expP[i]+1; M[x]=pro;
if (log10(x)+log10(Prime[pID])<=18.3 && expP[pID]<expP[pID-1]) { expP[pID]++; gensol(x*Prime[pID],pID); expP[pID]--; } if (log10(x)+log10(Prime[pID+1])<=18.3 && expP[pID]!=0) { expP[pID+1]++; gensol(x*Prime[pID+1],pID+1); expP[pID+1]--; } } void arrange() { map<unsigned long long,int>::iterator it; for (it=M.begin();it!=M.end();it++) { if (it->second > solVal[ctsol]) { ctsol++; solKey[ctsol]=it->first; solVal[ctsol]=it->second; } } } |
|
|