容斥例程 hdu 4135 Co-prime

来源:互联网 发布:釜山外国语大学 知乎 编辑:程序博客网 时间:2024/06/06 04:16
#include <stdio.h>#include <iostream>#include <algorithm>#include <cstring>#define INF ((1<<31)-1)using namespace std;typedef long long llt;int Factor[100000];int fi = 0;///计算质因子void sieve( int n ){    fi = 0;    for (int i = 2;i*i <= n;++i){        if ( 0 == n%i ) Factor[fi++] = i;        while( 0 == n%i) n /= i;    }    if (n>1) Factor[fi++] = n;}int main(){    int t,kase(1);    scanf("%d",&t);    while(t--){        llt a,b,k;        scanf("%I64d%I64d%I64d",&a,&b,&k);        sieve(k);        //cout <<"fi : "<<fi<<endl;        llt ans = 0,tmp,flag;        for (int i = 1;i < (1<<fi);++i){            tmp = 1, flag = 0;            for (int j = 0;j < fi;++j)                if ( i & (1<<j) ){                    flag++;                    tmp *= Factor[j];                }            if ( flag&1 )                ans += (b/tmp - (a-1)/tmp);            else                ans -= (b/tmp - (a-1)/tmp);        }        printf("Case #%d: %I64d\n",kase++,b-a+1-ans);    }    return 0;}

0 0