HDU——1573 X问题

又来一发水题。

解同余方程而已,用类似于剩余定理的方法就O了。

直接上代码:(注意要判断是否有解这种情况)

 

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;

ll c[22],m[22],n,t,tot;

void exgcd(ll A,ll B,ll& d,ll& x,ll& y)
{
    if (B==0) { x=1,y=0,d=A; }
    else { exgcd(B,A%B,d,y,x); y-=A/B*x; }
}

ll china()
{
    bool ans=true;
    ll am=m[1],d,y0,z0;
    ll ac=c[1];
        for (ll i=2; i<=n; i++)
        {
            exgcd(am,m[i],d,y0,z0);
            if ((ac-c[i])%d!=0)
            {
                ans=false;
                break;
            }
            y0=(c[i]-ac)/d*y0;
            y0=((y0%(m[i]/d))+(m[i]/d))%(m[i]/d);
            ac=am*y0+ac,am=am/d*m[i],ac=(ac%am+am)%am;
        }
        if (ac==0) ac=am;//这里是题目说明了整数,不能为0哦。
    if (ac>tot || ans==false) return 0;
    return (tot-ac)/am+1;
}

int main()
{
    cin>>t;
    while (t--)
    {
        cin>>tot>>n;
        for (ll i=1; i<=n; i++) scanf("%I64d",&m[i]);
        for (ll i=1; i<=n; i++) scanf("%I64d",&c[i]);
        cout<<china()<<endl;
    }
    return 0;
}

 

posted @ 2013-10-01 18:28  092000  阅读(256)  评论(0编辑  收藏  举报