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

题目链接:https://nanti.jisuanke.com/t/30999

大意,给你一个n,让你求这个数只能被两个非平方数相乘得到,问你从1到这个数的前缀和。

#include<bits/stdc++.h>
using namespace std;
#define maxn 20000000+10
int a[m`axn];
int ans[maxn];
int c[maxn];
int vis[maxn];
void prim()
{
    int t=0;
    ans[1]=1;
    for(int i=2; i<maxn; i++)
    {
        if(vis[i]==0)
        {
            c[++t]=i;
            ans[i]=2;
        }
        for(int j=1; j<=t; j++)
        {
            int temp=c[j]*i;
            if(temp>=maxn)break;
            vis[temp]=1;
            if(i%c[j])ans[temp]=ans[i]*ans[c[j]];
            else
            {
                int tp=c[j]*c[j];
                if(i%tp==0)ans[temp]=0;
                else ans[temp]=ans[temp/tp]*ans[1];
                break;
            }
        }
    }
}
int main()
{
    prim();
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    for(int i=1; i<maxn; i++)
    {
        ans[i]+=ans[i-1];
    }
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        cout<<ans[n]<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/letlifestop/p/10262936.html