51Nod_1352 集合计数
http://www.51nod.com/Challenge/Problem.html#!#problemId=1352
题目
给出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
分析
扩展欧几里得。
C++程序
#include<iostream>
using namespace std;
typedef long long ll;
ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll gcd=ex_gcd(b,a%b,x,y);
ll t=x;
x=y,y=t-a/b*y;
return gcd;
}
ll solve()
{
ll x,y,a,b,gcd,n,r;
cin>>n>>a>>b;
gcd=ex_gcd(a,b,x,y);
if((n+1)%gcd) return 0;
x=x*((n+1)/gcd);
r=b/gcd;
x=(x%r+r)%r;
if(x==0) x=r;
ll remain=n-x*a;
ll ans=0;
if(remain<0)
return 0;
else
ans=1+remain/(a*b/gcd);
return ans;
}
int main()
{
int t;
cin>>t;
while(t--){
cout<<solve()<<endl;
}
return 0;
}