大整数取模
输入正整数n,m,输出n mod m,其中
首先,把大整数写成自左向右的形式:1234=((1*10+2)*10+3)*10+4,然后每部取模
公式:
//大整数取模
scanf("%s%d",n,&m);
int len=strlen(n);
int ans=0;
for(int i=0;i<len;++i){
ans=(int)((long long)ans*10+n[i]-'0')%m; //long long防止中间过程溢出
}
也可以一直用long long,但是一定要注意乘法溢出的问题
幂取模
输入正整数a,n,m,输出
的值。
int pow_mod(int a,int n,int m){
int ans=1;
for(int i=0;i<n;++i) ans=(int)((long long)ans * a % m);
}
的算法: 快速幂
int pow_mod(int a,int n,int m){
int ans=1;
long long res=a;
while(n){
if(b&1) ans=(long long)ans*res%m;
res=res*res%m;
n>>=1;
}
return ans;
}
的算法:分治的思想
int pow_mod(int a,int n,int m){
if(n==0) return a;
long long x=pow_mod(a,n/2,m);
long long ans=x*x%m;
if(n&1) return (int)ans*a%m;
return (int)ans;
}
模线性方程组
输入正整数a,b,n,求解方程组
.
解释
注意,同余方程的一个解是指一个等价类,所以有无穷多组解(x,y),但我们只是提出其中的gcd(a,b)个,因为其他的都可以归到这**gcd(a,b)**个等价类中
所以,对于 这个方程,如果gcd(a,n)=1,那么x有唯一解,否则无解。