个人模板 快速幂取模,矩阵快速幂,快速乘
2017-03-27 17:54
357 查看
#include<bits/stdc++.h> using namespace std; const int MOD = 1007; int xx(int a,int n,int MOD) //计算a的n次方对MOD取模 { int ret=1; int tmp=a%MOD; while(n) { if(n&1) ret=ret*tmp%MOD; tmp=tmp*tmp%MOD; n>>=1; } return ret; } int main() { int m,n; while(scanf("%d%d",&m,&n)==2) { printf("%d\n",xx(m,n,MOD)); } }
#include <bits/stdc++.h> using namespace std; const int N = 4 ; int n; struct xx { int a ; } ori,res; xx mul(xx x,xx y) { xx temp; memset(temp.a,0,sizeof(temp.a)); for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { for(int k=0; k<N; k++) { temp.a[i][j]+=x.a[i][k]*y.a[k][j]; } } } return temp; } void init() { int x; for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { scanf("%d",&x); ori.a[i][j]=x; } } for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { res.a[i][j]=i==j?1:0; } } } xx calc(long long k) { while(k) { if(k%2==1) ///这么写比普通的快速幂好,亲身体会,HDU 5667用普通写法 TLE,这么写就过了 { res=mul(ori,res); k-=1; } else { ori=mul(ori,ori); k/=2; } } return res.a[0][0]; } int main() { while(cin>>n) { init(); calc(n); } }
long long mul(long long a,long long b) { long long res=0; while(b) { if(b&1) res=(a+res)%Mod; b>>=1; a=(a+a)%Mod; } return res; }
相关文章推荐
- 【个人模板】 快速幂取模,矩阵快速幂,快速乘
- 矩阵快速幂模板
- 矩阵快速幂模板
- 快速幂模板 -->加法快速幂+乘法快速幂+矩阵快速幂
- 【矩阵快速幂*模板】nyoj 301 递推求值
- poj 3070 矩阵快速幂模板
- 矩阵快速幂模板(1575)
- A Simple Math Problem(矩阵快速幂(模板))
- 矩阵快速幂模板
- poj 3070 Fibonacci(矩阵快速幂模板题)
- hdu5171 GTY's birthday gift 矩阵快速幂求斐波那契前n项和,矩阵快速幂模板
- 模板--快速幂及矩阵快速幂
- 矩阵快速幂模板
- 洛谷 P3390 【模板】矩阵快速幂
- hdu 1575 求一个矩阵的k次幂 再求迹 (矩阵快速幂模板题)
- 矩阵快速幂模板
- 洛谷P3390 【模板】矩阵快速幂
- [luoguP3390]【模板】矩阵快速幂
- 矩阵快速幂模板
- 51nod1113(矩阵快速幂模板)