Description
__int64 ago,there's a heaven cow called sjy...
A god bull named wzc fell in love with her...
As an OI & MOer,wzc gave sjy a quesiton...
给定一个整数n,求一个整数m,满足m<=n,并且m/phi(m)的值最大。
注:phi(m)代表m的欧拉函数,即不大于m且与m互质的数的个数。
Input
第一行是一个整数T,表示该测试点有T组数据。
接下来T行,每行一个整数n,意义如上所述。
Output
输出一共T行,每行一个整数m。
若对于某个n,有不止一个满足条件的m,则输出最小的m。
贪心考虑,答案为质数的前缀积,筛出60000以内的质数,离线处理询问
高精度需要压位优化
#include<cstdio> #include<cstring> int ps[60000],pp=0; bool isnp[60004]; int T; char str[30000]; int p10[]={1,10,100,1000}; struct integer{ int x[7000],id,ed; void read(){ scanf("%s",str); int l=strlen(str)-1; for(int i=0;i<=l;i++){ x[i>>2]+=p10[i&3]*(str[l-i]-'0'); } } void print(){ int p=6999; while(p&&!x[p])--p; printf("%d",x[p]); for(int i=p-1;~i;--i)printf("%04d",x[i]); putchar(10); } void operator*=(int a){ for(int i=0;i<7000;i++)x[i]*=a; for(int i=0;i<6999;i++)x[i+1]+=x[i]/10000,x[i]%=10000; } }q[100],v,v1; bool operator>(integer&a,integer&b){ for(int i=6999;~i;--i){ if(a.x[i]!=b.x[i])return a.x[i]>b.x[i]; } return 0; } int main(){ for(int i=2;i<=60000;i++){ if(!isnp[i])ps[pp++]=i; for(int j=0;j<pp&&i*ps[j]<=60000;j++){ isnp[i*ps[j]]=1; if(i%ps[j]==0)break; } } scanf("%d",&T); for(int i=0;i<T;i++){ q[i].id=i; q[i].read(); } v.x[0]=v1.x[0]=1; for(int i=0;i<pp;i++){ v*=ps[i]; for(int j=0;j<T;j++)if(!q[j].ed&&v>q[j]){ q[j]=v1; q[j].ed=1; } v1=v; } for(int i=0;i<T;i++){ for(int j=0;j<T;j++)if(q[j].id==i){ q[j].print(); } } return 0; }