1352 集合计数
- 1 秒
- 131,072 KB
- 20 分
- 3 级题
给出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个。
收起
输入
第1行:1个整数T(1<=T<=50000),表示有多少组测试数据。 第2 - T+1行:每行三个整数N,A,B(1<=N,A,B<=2147483647)
输出
对于每组测试数据输出一个数表示满足条件的集合的数量,占一行。
输入样例
2 5 2 4 10 2 3
输出样例
1 2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int t;
ll exgcd(ll a,ll b, ll &x,ll &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
ll t,ans=exgcd(b,a%b,x,y);
t=x;
x=y;
y=t-a/b*y;
return ans;
}
int main()
{scanf("%d",&t);
ll a,b,n;
while(t--)
{
scanf("%lld%lld%lld",&n,&a,&b);
ll ans=0,x,y;
ll gcd=exgcd(a,b,x,y);
ll lcm=a/gcd*b;
if((n+1)%gcd==0)
{
ll x0=x*((n+1)/gcd);
ll tt=(x0%(b/gcd)+b/gcd)%(b/gcd);
if(!tt)
tt=b/gcd;
ll sum=n-tt*a;
if(sum<0)
ans=0;
else
ans=sum/lcm+1;
}
printf("%lld\n",ans);
}
return 0;
}