phi。。。。

 越到后面,互质出现的频率越小,所以phi[1000003]=1000000即n未1000000时也只需要1000003,所以ll也不用

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn=1e6+7;
int p[maxn],phi[maxn];
void  f(){
    int cnt=0;
    memset(phi,0,sizeof(phi));
    phi[1]=1;
    for(int i=2;i<maxn-1;i++){
    	//vis可舍去,直接phi初始化为0,若phi仍为0,说明还未访问 
        if(!phi[i]) {
            p[++cnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=cnt&&i*p[j]<maxn-1;j++){
            if(i%p[j]==0){
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
            phi[i*p[j]]=phi[i]*(p[j]-1);
        }
    }
}

int main(){
    int t,n;
    int ans;
    scanf("%d",&t);
    f();
    while(t--){
        scanf("%d",&n);
        ans=n;
        //直接遍历也就O(n)时间,可忽略。不用专门搞个数组inv记录,也不用搞个结构体sort二分 
        while(phi[ans]<n)  ans++;   
        printf("%d\n",ans);
    }     
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_50904510/article/details/119854793
phi