版权声明:如果转载,请注明出处。 https://blog.csdn.net/S_999999/article/details/82182316
每个猫群里都分为雄猫和雌猫,第一个猫群里有1只雄猫和n只雌猫,第二个猫群里有2只雄猫和n-1只雌猫....第n个猫群里有n只雄猫和1只雌猫。
xjy和hqy都很喜欢猫,他们对猫分别有好感度a和b,当一个猫群的雄猫数是a的倍数时,这个猫群会对xjy产生好感,同样的,当一个猫群的雌猫数是b的倍数时,这个猫群会对hqy产生好感。
演唱结束后,他们想带一些猫群回他们自己的小窝,但是只有同时对xjy和hqy都产生好感的猫群才能被带走。
他们想知道能带走多少猫群,但xjy在hqy面前通常比较笨,所有只能求救于你了。
Input
第一行一个整数T,(1<=T<=50000),表示有T组测试样例。
之后T行,每行三个整数分别表示n,a,b(1<=n,a,b<=2147483647)
Output
共输出T行,每行对应一个测试数据,表示能带走的猫群数量。
Sample Input 1
2 5 2 4 10 2 3
Sample Output 1
1 2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(ll a,ll b){
if(b==0)
return a;
return gcd(b,a%b);
}
void ex_gcd(ll a, ll b,ll &x, ll &y){
if(b==0){
x = 1;
y = 0;
return ;
}
ex_gcd(b,a%b,x,y);
ll tmp = x;
x = y;
y = tmp - a/b * y;
return ;
}
int main(void){
int t;
scanf("%d",&t);
ll a,b,n;
while(t--){
scanf("%lld%lld%lld",&n,&a,&b);
int g = gcd(a,b);
if((n+1) % g!=0){
printf("0\n");
continue;
}
else {
ll x,y,ans=0;
ex_gcd(a,b,x,y);
ll k,minx , maxy, miny ;
k = (n +1)/g;
minx = x*k;
miny = y*k;
int d = b/g;
minx = ( minx%d + d)%d;
if(minx==0)
minx = d;
maxy = n+1- a * minx;
if(maxy<0)
ans =0;
else{
maxy /=b;
d = a/g;
miny = (miny%d +d )%d;
if(miny==0)
miny = d;
ans = (maxy -miny)/d +1;
}
printf("%lld\n",ans);
}
}
return 0;
}