题目描述
给出若干个正整数\(n\),请你求出最小的\(m\),使得\(\varphi(m)\ge n\)
输入
本题有多组输入。

第一行一个正整数T表示数据组数

接下来T行每行一个正整数n

数据保证\(1\le T \le 10^4, 1\le n \le 10^6\)
输出
共T行,每行一个数代表对应的答案
样例输入 Copy
5
1
2
3
4
5
样例输出 Copy
1
3
5
5
7

数学-欧拉函数

先将输入信息保存并排序,在求phi的过程中找到比输入的n更大的phi

#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
bool vis[N];
int p[N/3],phi[N];
struct num
{
    int val;
    int pos;
    bool operator < (const num & T) const 
    {
        return val<T.val;
    }
}ex[10010];
int T;
int ans[10010];
void euler()
{
    phi[1]=1;vis[1]=1;
    int cnt=0;
    int t=0;
    for(int i=1;i<=N-2;++i)
    {
        if(!vis[i]) p[++cnt]=i,phi[i]=i-1;
        for(int j=1;j<=cnt&&i*p[j]<N;++j)
        {
            vis[i*p[j]]=1;
            if(i%p[j]==0) {phi[i*p[j]]=p[j]*phi[i];break;}
            phi[p[j]*i]=phi[i]*(p[j]-1);
        }
        while(phi[i]>=ex[t].val&&t<T)//注意:要加t的限制以防一直自增,还要注意条件是t<T而非<=
        {
            ans[ex[t].pos]=i;
            t++;
        }
        if(t==T) return ;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>T;
    for(int i=0;i<T;++i)
    {
        cin>>ex[i].val;
        ex[i].pos=i;
    }
    sort(ex,ex+T);
    euler();
    for(int i=0;i<T;++i) cout<<ans[i]<<'\n';
}
 posted on 2023-05-15 01:01  ruoye123456  阅读(79)  评论(0)    收藏  举报