zoukankan      html  css  js  c++  java
  • hdu 4135 Co-prime 容斥原理

    题意是求a到b的闭区间内有多少个数与n互质,考虑到数据范围比较大,所以我们先用欧拉函数的方式将n的因子分解出来。对于每个因子我们采用dfs来组合他们,并求出范围内和他们不互质的数的个数。这里我们采用容斥原理来处理重复。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll ans,a,b,c[2048],n;
    int cnt;
    
    ll gcd(ll u,ll v)
    {
        return v==0?u:gcd(v,u%v);
    }
    
    void dfs(int cur,ll lcm,int num)
    {
        lcm=c[cur]/gcd(c[cur],lcm)*lcm;
        //printf("%lld
    ",lcm);
        if(num%2==1) ans+=(b/lcm-(a-1)/lcm);
        else ans-=(b/lcm-(a-1)/lcm);
    
        for(int i=cur+1;i<cnt;i++)
            dfs(i,lcm,num+1);
    }
    
    int main()
    {
        ll i;
        int _,k,j;
        scanf("%d",&_);
        for(k=1; k<=_; k++)
        {
            scanf("%lld%lld%lld",&a,&b,&n);
            memset(c,0,sizeof(c));
            ans=cnt=0;
            for(i=2;i*i<=n&&n>1;i++)
            {
                while(n%i==0)
                {
                    c[cnt++]=i;
                    while(n%i==0)
                        n/=i;
                }
            }
            if(n>1) c[cnt++]=n;
            for(j=0; j<cnt; j++)
                dfs(j,c[j],1);
            ans=b-a+1-ans;
            printf("Case #%d: %lld
    ",k,ans);
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    2014华为员工年终奖及年薪盘点
    Gradle命令行黑魔法
    委托的那些事
    动态代理
    音乐播放
    Eclipse plugin web site 发布和版本更新
    JavaScript—之对象参数的引用传递
    Bootstrap 3 How-To #1 下载与配置
    代码审计和漏洞挖掘的思路
    核心C#
  • 原文地址:https://www.cnblogs.com/xryz/p/4847815.html
Copyright © 2011-2022 走看看