这题有两种解法,1是根据欧拉函数性质:素数的欧拉函数值=素数-1(可根据欧拉定义看出)欧拉函数定义:小于x且与x互质的数的个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=1000000+10,maxn=500+100,inf=0x3f3f3f; ll Euler[N]; void euler() { Euler[1]=1; for(ll i=2;i<N;i++)Euler[i]=i; for(ll i=2;i<N;i++) if(Euler[i]==i) for(ll j=i;j<N;j+=i) Euler[j]-=Euler[j]/i; } int main() { ios::sync_with_stdio(false); cin.tie(0); ll t,n,cnt=0; euler(); cin>>t; while(t--){ cin>>n; ll ans=0; for(ll i=0;i<n;i++) { ll a; cin>>a; for(ll j=a+1;j<N;j++) if(Euler[j]==j-1) { ans+=j; break; } } cout<<"Case "<<++cnt<<": "<<ans<<" Xukha"<<endl; } return 0; } /********************* 3 5 1 2 3 4 5 6 10 11 12 13 14 15 2 1 1 *********************/
2是直接用素数筛
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=1000000+10,maxn=500+100,inf=0x3f3f3f; bool prime[N]; void getprime() { memset(prime,0,sizeof prime); prime[1]=1; for(int i=2;i<N;i++) { if(!prime[i]) { for(int j=2*i;j<N;j+=i) prime[j]=1; } } } int main() { ios::sync_with_stdio(false); cin.tie(0); ll t,n,cnt=0; getprime(); cin>>t; while(t--){ cin>>n; ll ans=0; for(ll i=0;i<n;i++) { ll a; cin>>a; for(ll j=a+1;j<N;j++) if(!prime[j]) { ans+=j; break; } } cout<<"Case "<<++cnt<<": "<<ans<<" Xukha"<<endl; } return 0; } /********************* 3 5 1 2 3 4 5 6 10 11 12 13 14 15 2 1 1 *********************/
后者仅花了56ms,前者120ms