excrt
跑一遍excrt,蓝后算算个数
用%lld就出锅(大雾)
#include<cstdio> #include<iostream> using namespace std; typedef long long ll; ll mod(ll x,ll p) {return x<0 ?x+p:x;} ll mul(ll x,ll y,ll p){ ll tmp=x*y-(ll)((long double)x/p*y+1.0e-8)*p; return mod(tmp,p); }ll g,a[20],b[20],M; void exgcd(ll a0,ll b0,ll &x,ll &y){ if(!b0) x=1,y=0,g=a0; else exgcd(b0,a0%b0,y,x),y-=x*(a0/b0); }int n; ll excrt(){ ll res=a[1],x,y,c,t,B;M=b[1]; for(int i=2;i<=n;++i){ B=b[i]; c=mod((a[i]-res)%B,B); exgcd(M,B,x,y); t=B/g; if(c%g) return -1; x=mul(x,c/g,t=B/g); res+=x*M; M*=t; res=mod(res%M,M); }return res; } int main(){ int t,q;scanf("%d",&t); while(t--){ scanf("%d%d",&q,&n); for(register int i=1;i<=n;++i) cin>>b[i]; for(register int i=1;i<=n;++i) cin>>a[i]; ll ans=excrt(); if(ans==-1||ans>q) printf("0 "); //无解 else{ int qaq=(!ans); //ans=0时要-1 ans=(q-ans)/M+1-qaq; //个数统计 printf("%I64d ",ans); } }return 0; }