思路大概差不多,就是求exgcd
但是不知道怎么求解的个数,这道题其实就是在问解的个数
题意:
思路:
假设我们求的最小的k1
那么每次让k2退lcm(a,b)格就是一个解
所以解的个数就是res/lcm(a,b)
注意求k1最小正整数解的时候应该注意:
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=2e6+10;
const int mod=1e9+7;
int N,A,B,x,y;
int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return d;
}
int lcm(int a,int b){
return a*b/__gcd(a,b);
}
void solve(){
cin>>N>>A>>B;
int D=exgcd(A,B,x,y);
if((N+1)%D!=0) cout<<0<<'\n';
else{
x=x*(N+1)/D;
int r=B/D;
x=(x%r+r)%r;
if(x==0) x+=r;
int res=(N)-x*A;
if(res<0) cout<<0<<'\n';
else cout<<res/lcm(A,B)+1<<'\n';
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}