模算数

大整数取模

输入正整数n,m,输出n mod m,其中 n < = 1 0 100 , m < = 1 0 9 n<=10^{100},m<=10^9

首先,把大整数写成自左向右的形式:1234=((1*10+2)*10+3)*10+4,然后每部取模
公式: ( a + b )   m o d   m = ( ( a   m o d   m ) + ( b   m o d   m ) )   m o d   m (a+b)\space mod\space m=((a \space mod\space m)+(b \space mod\space m))\space mod \space m

//大整数取模
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,输出 a n   m o d   m a^n\space mod \space m 的值。 a , n , m 1 0 9 a,n,m\le10^9
O ( n ) O(n)的算法

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); 
}

O ( l g ( n ) ) O(lg(n)) 的算法: 快速幂

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;
}

O ( l g ( n ) ) O(lg(n)) 的算法:分治的思想

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,求解方程组 a x b ( m o d   n ) ax\equiv b(mod \space n) . a , b , c 1 0 9 a,b,c\le10^9
解释
注意,同余方程的一个解是指一个等价类,所以有无穷多组解(x,y),但我们只是提出其中的gcd(a,b)个,因为其他的都可以归到这**gcd(a,b)**个等价类中

所以,对于 a x 1 ( m o d   n ) ax\equiv1(mod \space n) 这个方程,如果gcd(a,n)=1,那么x有唯一解,否则无解。

发布了50 篇原创文章 · 获赞 0 · 访问量 684

猜你喜欢

转载自blog.csdn.net/zpf1998/article/details/104201908