light1370 欧拉函数打表

时间:2023-01-16 19:37:39
/*
给定n个数ai,要求欧拉函数值大于ai的最小的数bi
求sum{bi}
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000005
int n,a[maxn]; int phi[maxn],m,v[maxn],prime[maxn];
void init(int n){
memset(v,,sizeof v);
m=;
for(int i=;i<n;i++){
if(v[i]==){//i是质数
v[i]=i,prime[++m]=i;
phi[i]=i-;
}
for(int j=;j<=m;j++){
if(prime[j]>v[i] || prime[j]*i>n)break;
v[i*prime[j]]=prime[j];//筛素数
phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-:
prime[j]);
}
}
}
/*int phi[maxn];
void init(int n){//用era筛的思路O(nlogn)复杂度
phi[1]=1;
for(int i=2;i<=n;i++)phi[i]=i;
for(int i=2;i<=n;i++)
if(phi[i]==i)//i是质数
for(int j=1;i*j<=n;j++)
phi[i*j]=phi[i*j]/i*(i-1);
}*/
int main(){
int t,tt;
init(maxn);
cin>>t;
for(tt=;tt<=t;tt++){
cin>>n;
for(int i=;i<=n;i++)cin>>a[i];
sort(a+,a++n); int j=;
long long ans=;
for(int i=;i<maxn;i++){
while(phi[i]>=a[j] && j<=n)
ans+=i,j++;
}
printf("Case %d: %lld Xukha\n",tt,ans);
}
}