ACM-ICPC 2018 南京赛区网络预赛 J

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36651153/article/details/82426449

参考博客https://blog.csdn.net/Eternally831143/article/details/82315353

代码如下

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int t,n;
const int maxn=2e7+7;
int pri[maxn],f[maxn];
bool vis[maxn];
void init()
{
    f[1]=1;
    for(int i=2,k=0;i<maxn;i++) {
        if(!vis[i]) {
            f[i]=2;
            pri[k++]=i;
        }
        for(int j=0;j<k&&i*pri[j]<maxn;j++) {
            int num=i*pri[j];
            vis[num]=1;
            if(i%pri[j]) {
                f[num]=f[i]*f[pri[j]];
            }
            else if(i%(pri[j]*pri[j])==0) {
                f[num]=0;
            }
            else{
                f[num]=f[num/(pri[j]*pri[j])];
                break;
            }
        }
    }
}
int main()
{
    init();
    for(int i=2;i<maxn;i++) {
        f[i]+=f[i-1];
    }
    scanf("%d",&t);
    while(t--) {
        scanf("%d",&n);
        printf("%d\n",f[n]);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36651153/article/details/82426449
今日推荐