hdu4002

本文介绍了一种算法,用于找到1到n范围内使得n/φ(n)最大的整数n,其中φ(n)是欧拉函数。通过计算连续素数的乘积来确定目标值,并使用字符串乘法处理大数运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值