1101: [POI2007]Zap
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2172 Solved: 839
[ Submit][ Status][ Discuss]
Description
FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a
,y<=b,并且gcd(x,y)=d。作为FGD的同学,FGD希望得到你的帮助。
Input
第一行包含一个正整数n,表示一共有n组询问。(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个
正整数,分别为a,b,d。(1<=d<=a,b<=50000)
Output
对于每组询问,输出到输出文件zap.out一个正整数,表示满足条件的整数对数。
Sample Input
2
4 5 2
6 4 3
4 5 2
6 4 3
Sample Output
3
2
//对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(
6,3),(3,3)。
2
//对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(
6,3),(3,3)。
HINT
Source
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<bitset>
#include<algorithm>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#include<cmath>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
typedef int LL;
const int maxn = 5E4 + 50;
int T,a,b,d,tot,mu[maxn],prime[maxn];
bool not_prime[maxn];
int getint()
{
char ch = getchar();
int ret = 0;
while (ch < '0' || '9' < ch) ch = getchar();
while ('0' <= ch && ch <= '9')
ret = ret*10 + ch - '0',ch = getchar();
return ret;
}
int main()
{
#ifdef DMC
freopen("DMC.txt","r",stdin);
#endif
mu[1] = 1;
for (int i = 2; i < maxn; i++) {
if (!not_prime[i]) {
prime[++tot] = i;
mu[i] = -1;
}
for (int j = 1; j <= tot; j++) {
int Nex = prime[j]*i;
if (Nex >= maxn) break;
not_prime[Nex] = 1;
mu[Nex] = -mu[i];
if (i % prime[j] == 0) {
mu[Nex] = 0;
break;
}
}
}
for (int i = 1; i < maxn; i++) mu[i] += mu[i-1];
T = getint();
while (T--) {
a = getint(); b = getint(); d = getint();
LL Ans = 0,A = a/d,B = b/d;
if (A > B) swap(A,B);
int last;
for (int i = 1; i <= A; i = last + 1) {
last = min(A/(A/i),B/(B/i));
Ans += 1LL*(mu[last] - mu[i-1])*(A/i)*(B/i);
}
printf("%d\n",Ans);
}
return 0;
}