1、线性同余方程
#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
using namespace std;
long long extGcd(long long a,long long b,long long &x,long long &y){
if(b==0){
x=1;
y=0;
return a;
}
long long d=extGcd(b,a%b,y,x);
y-=x*(a/b);
return d;
}
/*
计算ax%n=b的所有[0,n] 的解
结果保存到ans中
需要extGcd函数
*/
vector<long long> lineModEquation(long long a,long long b,long long n){
long long x,y;
vector<long long>ans;
ans.clear();
long d=extGcd(a,b,x,y);
if(b%d>0){
printf("NO answer\n");
}
else{
x%=n;x+=n;x%=n;
ans.push_back(x*(b/d)%(n/d));//--->(x*(b/d))%n
for(int i=1;i<=d;i++){
ans.push_back((ans[0]+i*n/d)%n);
}
}
return ans;
}
int main(){
//.....
return 0;
}
2、中国剩余定理
#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
using namespace std;
long long extGcd(long long a,long long b,long long &x,long long &y){
if(b==0){
x=1;
y=0;
return a;
}
long long d=extGcd(b,a%b,y,x);
y-=x*(a/b);
return d;
}
/*
要求m[0],m[1]....m[n-1]两两互质
求x=a1(mod)m[1] ,
x=a2(mod)m[2],
........
x=an(mod)m[n]
得:x=a1t1M1+a2t2M2+a3t3M3+....+antnMn+kM
*/
long long CRT(int n,int a[],int m[]){
long long M=1,x=0,xx,yy;
for(int i=0;i<n;i++){
M*=m[i];
}
for(int i=0;i<n;i++){
long long w=M/m[i];
extGcd(m[i],w,xx,yy);
x=(x+yy*w*a[i])%M;
}
return (x+M)%M;
}
int main(){
//.....
return 0;
}