求(1,n)中无平方因子的数(n<1e12)

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)-……+……。


hdu    Squarefree  number   

          思路:    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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值