刚学数论,很多都不熟。所以这道欧拉函数的题也是看了下题解才会。(主要是要知道O(n)的把所有数的欧拉函数都求出来)
const int maxn=1000005;
int ela[maxn];
int get_phi()
{
for(int i=1;i<maxn;i++) ela[i]=i;
for(int i=2;i<maxn;i++){
if(ela[i]==i){
ela[i]=i-1;
for(int j=2;j*i<maxn;j++)
ela[j*i]=ela[j*i]/i*(i-1);
}
}
}
之后就打出来表,然后因为φ(i)<=i-1所以就从i=luckey number+1开始往后找.
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000005;
int ela[maxn];
int get_phi()
{
for(int i=1;i<maxn;i++) ela[i]=i;
for(int i=2;i<maxn;i++){
if(ela[i]==i){
ela[i]=i-1;
for(int j=2;j*i<maxn;j++)
ela[j*i]=ela[j*i]/i*(i-1);
}
}
}
int main()
{
get_phi();
int t;cin>>t;
for(int j=1;j<=t;j++){
int n;cin>>n;
long long ans=0;
for(int i=1;i<=n;i++){
int num;cin>>num;
int stp=num+1;
while(ela[stp]<num) stp++;
ans+=stp;
}
cout<<"Case "<<j<<": ";
cout<<ans<<" Xukha"<<endl;
}
}