hdu 1695 GCD(容斥原理)

来源:互联网 发布:软件企业 编辑:程序博客网 时间:2024/05/16 18:50

和hdu 2841差不多,去个重复就行
x 属于(1,b),y属于(1,d),gcd(x,y)=k,就是gcd(x/k,y/k)=1,x/k属于(1,b/k),y/k属于(1,d/k)

#include <bits/stdc++.h>using namespace std;vector<int> p;int solve(int num, int n){    if(num == 1) return n;    p.clear();    for(int i = 2; i <= num/i; ++i)    {        if(num%i == 0)        {            p.push_back(i);            while(num%i == 0) num /= i;        }    }    if(num > 1) p.push_back(num);    int len = p.size();    int ret = 0;    for(int i = 1; i < (1<<len); ++i)    {        int mult = 1;        int cnt = 0;        for(int j = 0; j < len; ++j)        {            if(i&(1<<j))            {                ++cnt;                mult *= p[j];            }        }        if(cnt&1) ret += n/mult;        else ret -= n/mult;    }    return n-ret;}int main(){    ios::sync_with_stdio(false);    int T,a,b,c,d,k;    long long res;    cin >> T;    int time = 0;    while(T--)    {        cin >> a >> b >> c >> d >> k;        cout << "Case " << ++time << ": ";        if(k == 0)        {            cout << 0 <<endl;            continue;        }        b /= k;        d /= k;        if(b == 0 || d == 0)        {            cout << 0 <<endl;            continue;        }        if(b > d)swap(b,d);//让b作为小的        res = 1;        for(int i = 1; i <= b; ++i)            res += (solve(i,d) - solve(i,i));        cout << res << endl;    }    return 0;}
原创粉丝点击