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],问该物总数几何?