bzoj 1573 X問題【擴充套件中國剩餘定理】
阿新 • • 發佈:2018-11-26
擴充套件中國剩餘定理的板子,合併完之後算一下範圍內能取幾個值即可(記得去掉0)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; const int N=15; int T,n,m; long long a[N],b[N],A,B,x,y,d; bool fl; void exgcd(long long a,long long b,long long &d,long long &x,long long &y) { if(!b) { d=a,x=1,y=0; return; } exgcd(b,a%b,d,y,x); y-=a/b*x; } int main() { scanf("%d",&T); while(T--) { fl=0; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d",&b[i]); A=a[1],B=b[1]; for(int i=2;i<=m;i++) { exgcd(A,a[i],d,x,y); if((b[i]-B)%d) { fl=1; break; } x=((b[i]-B)/d*x%(a[i]/d)+(a[i]/d))%(a[i]/d); B=B+x*A; A=A/d*a[i]; B%=A; } if(fl||n<B) puts("0"); else printf("%lld\n",(n-B)/A+1-(B==0)); } return 0; }