HDU 1573 X问题

这题和poj 2891类似 可以用扩展gcd解之 

因为循环求出的解中 b1为所求的最小解 而a1巧好为 a【i】数组的lcm

我们知道要使得一个数满足题意要求那么这个数满足 b1(求出的最小解)+lcm*t<=n

这样t就是我们所要求的 注意特判b1为0的情况b

ACcode:

#include <bits/stdc++.h>
#define maxn 100
#define ll long long
using namespace std;
ll A[maxn],B[maxn];
ll gcd(ll a, ll b){return b?gcd(b,a%b):a;}
ll ex_gcd(ll a,ll b, ll &x,ll &y){
    if(a==0&&b==0)return -1;
    if(b==0){x=1,y=0;return a;}
    ll d=ex_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
int main(){
    int loop;
    ll n,m,lcm,x,y,a1,a2,b1,b2,a,b,d,c;
    scanf("%d",&loop);
    while(loop--){
        cin>>n>>m;
        for(int i=1;i<=m;++i)cin>>A[i];
        for(int i=1;i<=m;++i)cin>>B[i];
        a1=A[1],b1=B[1];
        bool flag=true;
        for(int i=2;i<=m;++i){
            a2=A[i],b2=B[i];
            a=a1,b=a2,c=b2-b1;
            d=ex_gcd(a,b,x,y);
            if(c%d){
                flag=false;
                continue;
            }
            ll t=b/d;
            x=(x*(c/d)%t+t)%t;
            b1=a1*x+b1;
            a1=a1*(a2/d);///a1= lcm(a1,a2)
        }
        if(!flag||b1>n)puts("0");
        else printf("%I64d\n",(n-b1)/a1+1-(b1==0?1:0));
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值