HDU 4135 Co-prime【素因子+容斥】

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4135
題目大意:計算給定區間[A,B][A,B]NN互質的數的個數。
思路:簡單容斥裸題。
AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,n;
vector<ll>prime;
void solve(ll n)
{
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            prime.push_back(i);
            while(n%i==0){
                n/=i;
            }
        }
    }
    if(n>1){
        prime.push_back(n);
    }
}
ll cal(ll r)
{
    ll ans=0;
    for(ll i=1;i<(1<<prime.size());i++){
        ll mul=1,cnt=0;
        for(int j=0;j<prime.size();j++){
            if(i&(1<<j)){
                cnt++;
                mul*=prime[j];
            }
        }
        mul=r/mul;
        if(cnt&1){
            ans+=mul;
        }
        else{
            ans-=mul;
        }
    }
    return r-ans;
}
int main()
{
    int t;
    cin>>t;
    int Case=0;
    while(t--){
        cin>>a>>b>>n;
        prime.clear();
        solve(n);
        cout<<"Case #"<<++Case<<": ";
        cout<<cal(b)-cal(a-1)<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章