NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#include<bits/stdc++.h>

const int INF  = 0x3f3f3f3f;
const int Maxn = 100005;

#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;

int  x[Maxn], num;

int deal(ll N) {  // 对N分解质因数
    int nm = 0;
    for (int i = 2; i * i <= N; i++) {
        if (N && N % i == 0) {
            x[++nm] = i;
            while (N && N % i == 0)
                N /= i;
        }
    }
    if (N > 1) x[++nm] = N;

    return nm;
}
ll func(ll n, int m) {   //  计算1-n的数中 和N不互质的个数
    ll ans = 0, flag;
    for (int i = 1; i < (1 << m); i++) { // 用二进制来1,0来表示第几个素因子是否被用

        ll tmp = 1, flag = 0;

        for (int j = 1; j <= m; j++)  // 判断第几个因子目前被用到  
            if (i & (1 << (j - 1)))
                ++flag, tmp *= x[j];

        if (flag & 1)  // 容斥原理,奇加偶减  
            ans += n / tmp;
        else ans -= n / tmp;

    }
    return ans;
}
int main() {
    int T, icase = 1;
    ll a, b, N;
    cin >> T;
    while (T--) {
        cin >> a >> b >> N;
        num = deal(N);
        ll ans = (b - a + 1) - (func(b, num) - func(a - 1, num));
        printf("Case #%d: %lld\n", icase++, ans);
    }
}

  

posted on 2017-05-25 22:57  NWU_ACM  阅读(104)  评论(0编辑  收藏  举报