要找 a 到 b 之间 和k 互质的数,只要找到和 k 不互质的数就好了
先对 k 进行分解,分解成全部的质因子
然后找就是了 2333
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctype.h>
#include <vector>
#include <algorithm>
#include <sstream>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
using namespace std;
typedef long long ll;
const int maxn = 30, INF = 0x3f3f3f3f, mod = 1e9 + 7;
ll a, b, k, n;
ll m[maxn];
void init() {
int id = 0;
for(ll i = 2; i*i <= k; ++i) {
if(k % i == 0) {
m[id++] = i;
while(k % i == 0) k /= i;
}
}
if(k > 1) m[id++] = k;
n = id;
}
ll solve(int id, ll r_) {
ll ans = 0;
for(int i = id; i < n; ++i)
ans += ( r_/m[i] - solve(i+1, r_/m[i]));
return ans;
}
int main() {
int T;
int kase = 1;
cin >> T;
while(T--) {
cin >> a >> b >> k;
init();
cout << "Case #" << kase++ << ": " << (b-solve(0,b) - (a-1-solve(0,a-1)) ) << endl;
}
return 0;
}