51nod1352扩展欧几里得

1352 集合计数

  1. 1 秒
  2.  
  3. 131,072 KB
  4.  
  5. 20 分
  6.  
  7. 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;
}

猜你喜欢

转载自blog.csdn.net/sdauguanweihong/article/details/89762221