Co-prime

B - Co-prime
参考:HDU 4135 Co-prime (容斥原理)

这个题利用的是容斥原理,同时也利用到了求质数个数的一个技巧—— 1~m 内与 n 不互质的个数为 m/n 个:

prime.clear();
    for(ll i=2;i*i<=n;++i)
    {
        if(n%i==0)
            prime.emplace_back(i);
        while (n%i==0)
            n/=i;
    }
    if(n>1) prime.emplace_back(n);

同时使用容斥原理的时候求各种组合的时候利用了二进制的技巧:

ll sum=0,siz=prime.size();
    for(ll i=1;i<(1<<siz);++i)  // i 为 1 时取 prime[0],i 为 101(二进制) 时取 prime[0] prime[2]
    {
        ll val=1,cnt=0;
        for(ll j=0;j<siz;++j)
            if(i&(1<<j))
                val*=prime[j],cnt++;
        if(cnt&1) sum+=x/val;
        else sum-=x/val;
    }

代码(记得 long long .....因为这个 WA 了一发):

// Created by CAD on 2019/8/10.
#include <bits/stdc++.h>
using namespace std;
using pii=pair<int, int>;
using piii=pair<pair<int, int>, int>;
using ll=long long;
vector<ll> prime;

ll cal(ll x,ll n)
{
    prime.clear();
    for(ll i=2;i*i<=n;++i)
    {
        if(n%i==0)
            prime.emplace_back(i);
        while (n%i==0)
            n/=i;
    }
    if(n>1) prime.emplace_back(n);
    ll sum=0,siz=prime.size();
    for(ll i=1;i<(1<<siz);++i)
    {
        ll val=1,cnt=0;
        for(ll j=0;j<siz;++j)
            if(i&(1<<j))
                val*=prime[j],cnt++;
        if(cnt&1) sum+=x/val;
        else sum-=x/val;
    }
    return x-sum;
}
ll a,b,n;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    for(int cas=1;cas<=t;++cas)
    {
        cin>>a>>b>>n;
        cout<<"Case #"<<cas<<": "<<1ll*cal(b,n)-1ll*cal(a-1,n)<<endl;
    }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务