首页 > 代码库 > 「Poetize3」Heaven Cow与God Bull

「Poetize3」Heaven Cow与God Bull

描述 Description
给定一个整数n,求一个整数m,满足m<=n,并且m/phi(m)的值最大。
注:phi(m)代表m的欧拉函数,即不大于m且与m互质的数的个数。
题解:
m/phi(m) 很容易化成 连积(p/(p-1))  p|m
所以就很简单了,将最小的质数乘起来,直到>n,输出前一个。
因为保证最小所以只乘一次,因为p/(p-1)单调减,所以从小的开始选。
高精度写错搞了好久,然后有卡了几次时才过了
代码:
  1 #include<cstdio>  2   3 #include<cstdlib>  4   5 #include<cmath>  6   7 #include<cstring>  8   9 #include<algorithm> 10  11 #include<iostream> 12  13 #include<vector> 14  15 #include<map> 16  17 #include<set> 18  19 #include<queue> 20  21 #include<string> 22  23 #define inf 1000000000 24  25 #define maxn 100000 26  27 #define maxm 500+100 28  29 #define eps 1e-10 30  31 #define ll long long 32  33 #define pa pair<int,int> 34  35 #define for0(i,n) for(int i=0;i<=(n);i++) 36  37 #define for1(i,n) for(int i=1;i<=(n);i++) 38  39 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 40  41 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 42  43 #define mod 10 44  45 using namespace std; 46  47 inline int read() 48  49 { 50  51     int x=0,f=1;char ch=getchar(); 52  53     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();} 54  55     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();} 56  57     return x*f; 58  59 } 60 int n,m,tot,p[maxn]; 61 bool v[maxn]; 62 char ch[maxn]; 63 class bigg{ 64 public: 65     int num[maxn],len; 66     bigg() 67     { 68         memset(num,0,sizeof(num)); 69         len=0; 70     } 71     inline bigg operator =(const bigg &b) 72     { 73         memset(num,0,sizeof(num)); 74         len=b.len; 75         for1(i,len)num[i]=b.num[i]; 76         return(*this); 77     } 78     inline bigg operator =(int b) 79     { 80         memset(num,0,sizeof(num)); 81         len=0; 82         while(b){num[++len]=b%mod;b/=mod;} 83         return(*this); 84     } 85     inline bigg operator *(int b) 86     { 87         for1(i,len)num[i]*=b; 88         for1(i,len) 89         { 90             num[i+1]+=num[i]/mod; 91             num[i]%=mod; 92             if(num[len+1])len++; 93         } 94         return(*this); 95     } 96     inline bool operator <(const bigg&b) 97    { 98       if(len!=b.len)return len<b.len; 99       for3(i,len,1)if(num[i]!=b.num[i])return num[i]<b.num[i];100       return 1;101    }102     inline void print()103     {104         printf("%d",num[len]);105         for3(i,len-1,1)printf("%d",num[i]);printf("\n");106     }107 };108 bigg a[105],b,c[105];109 int rk[105];110 bool cmp(int x,int y){return a[x]<a[y];}111 112 int main()113 114 {115 116     freopen("input.txt","r",stdin);117 118     freopen("output.txt","w",stdout);119     for2(i,2,maxn)120     {121         if(!v[i])p[++tot]=i;122         for1(j,tot)123         {124             int k=p[j]*i;125             if(k>maxn)break;126             v[k]=1;127             if(i%p[j]==0)break;128         }129     }130 131     n=read();132     for1(i,n)133     {134         scanf("%s",ch+1);135         a[i].len=strlen(ch+1);136         for1(j,a[i].len)a[i].num[j]=ch[a[i].len+1-j]-0;137         rk[i]=i;138     }    139     sort(rk+1,rk+n+1,cmp);140     int j=1;141     b=j;142     //for1(i,100)b=b*p[i],b.print();143     for1(i,n)144     {145         c[rk[i]]=c[rk[i-1]];146         while(b<a[rk[i]])c[rk[i]]=b,b=b*p[j++];147         //b.print();148     }149     //for1(i,n)a[rk[i]].print(),c[rk[i]].print();150     for1(i,n)c[i].print();151 152     return 0;153 154 }
View Code

 不知道每组询问暴力求会不会T,我为了保险拍了个序233

「Poetize3」Heaven Cow与God Bull