LightOJ - 1370 Bi-shoe and Phi-shoe (欧拉函数打表)
Posted xiuwenli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",cas++,sum); } return 0; }
以上是关于LightOJ - 1370 Bi-shoe and Phi-shoe (欧拉函数打表)的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ - 1370 Bi-shoe and Phi-shoe(欧拉函数)
LightOJ - 1370 Bi-shoe and Phi-shoe
LightOJ - 1370 Bi-shoe and Phi-shoe 欧拉函数 题解
Lightoj1370 Bi-shoe and Phi-shoe