此题求1~n之间n/φ(n)最大的n,φ(n)=n/(1-i/p1)*(1-1/p2)······(1-1/pk);
n/φ(n)=p1/(p1-1) * p1/(p1-1) * ·······*pk/(pk-1);
所以得出n的素因子越多,n/φ(n)就越大。
而且最后结果一定是连续素数的乘积;
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<string>
using namespace std;
int prime[1000];
void isprime()
{
for(int i=2;i<1000;i++)
for(int j=i+i;j<1000;j+=i)
prime[j]=1;
}
string operator *(string &a,string &b)
{
int sum[1200],i,j,num;
int len1=a.length();
int len2=b.length();
memset(sum,0,sizeof(sum));
for(i=len2-1;i>=0;i--) //b
for(j=len1-1,num=len2-1-i;j>=0;j--) //a
{
sum[num]+=(b[i]-'0')*(a[j]-'0');
sum[num+1]+=sum[num]/10;
sum[num]%=10;
num++;
}
while(sum[num]==0) num--;
string c;
for(i=num;i>=0;i--)
c+=(sum[i]+'0');
return c;
}
int main()
{
isprime();
string aa[500];
char sa[120];
aa[0]="2";
int num=1,i;
for(i=3;i<1000;i++)
if(prime[i]==0)
{
string ss;
sprintf(sa,"%d",i);
ss=sa;
aa[num]=aa[num-1]*ss;
num++;
}
int ca;
string ss;
scanf("%d",&ca);
while(ca--)
{
cin>>ss;
for(i=0;i<num;i++)
{
if(aa[i].length()>ss.length()) break ;
if(ss.length()>aa[i].length()) continue;
if(aa[i]>ss) break;
}
cout<<aa[i-1]<<endl;
}
return 0;
}