又来一发水题。
解同余方程而已,用类似于剩余定理的方法就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; }