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;
}