您的位置:首页 > 其它

51Nod 1352 集合计数

2016-12-14 19:33 162 查看
给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数。

提示:

对于第二组测试数据,集合分别是:{1,10},{2,9},{3,8},{4,7},{5,6},{6,5},{7,4},{8,3},{9,2},{10,1}.满足条件的是第2个和第8个。

Input

第1行:1个整数T(1<=T<=50000),表示有多少组测试数据。
第2 - T+1行:每行三个整数N,A,B(1<=N,A,B<=2147483647)


Output

对于每组测试数据输出一个数表示满足条件的集合的数量,占一行。


Input示例

2
5 2 4
10 2 3


Output示例

1
2

#include <stdio.h>
#include <string.h>
typedef long long LL;
using namespace std;

LL exgcd(LL a, LL b, LL &x, LL &y)
{
LL r,t;
if(b==0)
{
x=1;
y=0;
return a;
}
r=exgcd(b,a%b,x,y);
t=x;
x=y;
y=t-a/b*y;
return r;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
LL ans = 0;
LL n, a, b;
LL x,y,d,r;
scanf("%lld%lld%lld",&n, &a, &b);
d = exgcd(a, b, x, y);
if((n + 1)%d != 0) ans = 0;
else {
LL LCM = a* b / d;
x = x *(((n + 1) % b) / d);
r = b / d;
x =(x % r + r) % r; //满足方程的最小的x
if(x == 0)
{
x = LCM / a;
}
if(x * a > n)
{
ans = 0;
printf("%lld\n", ans);
continue;
}
ans = ((n - x*a) / LCM);
ans++;
}
printf("%I64d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: