数论知识整理

1.快速幂


求 a
b  mod p ,其中p=1e9+7 。

解题思路:把b转化为二进制b=13

13=8+4+1

ab=a8+4+1=a8*a4*a1

可以先把a的1次、a的2次,a的4次。。。。预处理出来

再把b转成二进制,如果第i位是1,那么就乘上a的2i次方。



#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
long long a,b;
long long qkpow(long long x,long long y){
	long long ans=1;
	long long bin=x%M;
	while(y!=0){
		if(y&1!=0)ans=(ans*bin)%M;
		bin=(bin*bin)%M;
		y>>=1;
	}
	return ans;
}
int main(){
	cin>>a>>b;
	cout<<qkpow(a,b);
	return 0;
}


这里使用了位运算进行优化,思路自然。


2.扩展欧几里得算法


已知a,b,求x,y使得ax+by=gcd(a,b)


#include<bits/stdc++.h>
using namespace std;
long long x,y,a,b,d;
void gcd(long long a,long long b,long long& d,long long&x,long long& y){
    if(!b){d=a;x=1;y=0;}
    else{gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int main(){
    cin>>a>>b;
    gcd(a,b,d,x,y);
    cout<<(x+b)%b;
    return 0;
}

3.中国剩余定理

题目描述:《孙子算经》中的题目:有物不知其数,A[i]个一数余B[i],问该物总数几何?



猜你喜欢

转载自blog.csdn.net/zryabc/article/details/80056508