hdu4002

来源:互联网 发布:德国骨科知乎 编辑:程序博客网 时间:2024/06/02 04:26

此题求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;}

原创粉丝点击