1, 生成素数表;
2,递归(容斥原理):
lld dfs(int j,lld num)
{
lld ret=0;
for(int h=j; h<cnt&&(lld)prime[h]*prime[h]<=num; h++)
{
ret+=num/prime[h]/prime[h]-dfs(h+1,num/prime[h]/prime[h]);
}
return ret;
}
思路:
利用类似筛选法把100010的素数标记出来(预处理)
然后通过容斥原理,把有平方因子数的个数算出来,那总个数-有平方因子个数 = 答案
n之内有平方因子的数的个数sum = n/(2^2) + n/(3^2)+……+n/(k^2) - n/(2^2 * 3^2)-……+……。
思路: 1,判断n<1e 6的数 ...... 先打出1000 000 的·素数表,每一个含有平方因子的数,都能拆成质数的平方*某些质数:
2,大于1e 6的数........... 直接对其开方,。。。。。。。。
const int maxn=1e6+5;
int prime[maxn];
bool vis[maxn]={0};
int cnt=0;
void Prime()
{
for(int i=2; i<=maxn; i++)
if(!vis[i])
{
prime[cnt++]=i;
for(int j=2;i*j<=maxn;j++)
vis[i*j]=1;
}
}
int main()
{
int t,k=0,num;
cin>>t;
long long n,m,ss;
bool flag;
Prime();
while(t--)
{
k++;
cin>>n;
flag=0;
for(int i=0;i<cnt;i++)
{
m=n;
num=0;
while(m%prime[i]==0)
{
m/=prime[i];
num++;
if(num>=2) { flag=1;break;}
}
if(flag) break;
}
if(n>1e6)
{
ss=(int)sqrt((double)n);
if(ss*ss==n) flag=1;
}
if(flag)
printf("Case %d: No\n",k);
else
printf("Case %d: Yes\n",k);
}
return 0;
}