和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;
}