LightOJ - 1370 Bi-shoe and Phi-shoe (欧拉函数打表)

题意:给N个数,求对每个数ai都满足最小的phi[x]>=ai的x之和。

分析:先预处理出每个数的欧拉函数值phi[x]。对于每个数ai对应的最小x值,既可以二分逼近求出,也可以预处理打表求。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1100005;
int phi[maxn];
int res[maxn];
bool isprime[maxn];

void Euler(){             //欧拉筛
    for(int i=1;i<maxn;++i) phi[i] = i;
    memset(isprime,1,sizeof(isprime));
    isprime[0] = isprime[1] = false;
    phi[1] =0;
    for(int i=2;i<maxn;++i){
        if(!isprime[i]) continue;
        for(int j=i;j<maxn;j+=i){
            isprime[j] = false;
            phi[j] -= phi[j]/i;
        }
    }
}

void pre(){
    memset(res,0,sizeof(res));
    for(int i=1;i<maxn;++i){
        for(int j=phi[i];j>=0 && res[j]==0;--j){
            res[j] = i;
        }
    }
}

int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int T,N,a,cas=1;
    Euler();
    pre();
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        LL sum=0;
        for(int i=0;i<N;++i){
            scanf("%d",&a);
            sum +=res[a];
        }
        printf("Case %d: %lld Xukha\n",cas++,sum);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xiuwenli/p/9438885.html