由此入门
- 同余方程组(模非互质)可以通过合并方程求解。
- 假设以上都知道的。或者点击打开链接
- 通过以上方法求得最小正整数解x 方程组的模底为lcm=LCM(a1,a2...an)
- 通解:
- 有解:
- 无解:
- 注意:有解时,若a=0 则t=0去除,题目要求正整数。
#include<cstdio>
#define ll long long
int x,y;
int d;
int A[20];
int B[20];
void exgcd(int a,int b){
if(b==0){
d=a;
x=1;
y=0;
return ;
}
exgcd(b,a%b);
int t=x;
x=y;
y=t-(a/b)*y;
}
int mod(int x,int n){
return (x%n+n)%n;
}
//x=b[i](mod c[i])
ll equation(int b[],int c[],int n){
for(int i=1;i<n;i++){
exgcd(c[i-1],c[i]);
if((b[i]-b[i-1])%d)return -1;
x=mod(x*(b[i]-b[i-1])/d,c[i]/d);
b[i]=b[i-1]+x*c[i-1];
c[i]=c[i-1]*c[i]/d;
}
return b[n-1];
}
int main(){
int T;
ll N,M;
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&N,&M);
for(int i=0;i<M;i++)
scanf("%d",&A[i]);
for(int i=0;i<M;i++)
scanf("%d",&B[i]);
ll F=equation(B,A,M);
if(F==-1||F>N)printf("0\n");
else {
//x+lcm*t<=N
ll lcm=1;
for(int i=0;i<M;i++){
exgcd(lcm,A[i]);
lcm=(lcm*A[i])/d;
}
if(F==0)printf("%lld\n",(N-F)/lcm);
else printf("%lld\n",(N-F)/lcm+1);
}
}
return 0;
}
本文介绍了如何解决模非互质的同余方程组问题,强调了解的求法以及最小正整数解的计算,涉及到最大公约数LCM在解题中的应用,并讨论了方程组有解和无解的情况,特别指出在有解时,若出现a=0则t=0需排除,以符合正整数解的要求。

被折叠的 条评论
为什么被折叠?



