快速乘、快速幂(矩阵快速幂)
当mod一个大数p的时候,还有进行乘法的时候可能会爆long long的时候,就用快速乘或者快速幂。
参考:http://www.cnblogs.com/whywhy/p/5066730.html
先上模板:
快速乘:
ll multi(ll a,ll b,ll m) { ll ans=0; while(b) { if(b&1) (ans+=a) %= m; (a=a*2) %= m; b/=2; } return ans; }
快速幂:
ll pow_mod(ll a,ll b,ll m) { ll res=1; while(b) { if(b&1) res=multi(res,a,m); //这里要用到快速乘 a=multi(a,a,m); b/=2; } return res; }
还有一种是:矩阵快速幂,根据题目分析,然后建立相关的矩阵,再用快速幂;
矩阵快速幂:
node mult(node a,node b) //进行矩阵的计算 { node t; for(int i=0;i<2;i++) for(int j=0;j<2;j++) { t.m[i][j]=0; for(int p=0;p<2;p++) t.m[i][j]=((t.m[i][j]+a.m[i][p]*b.m[p][j])%MOD+MOD)%MOD; } return t; } void pow_mod(long long n) { original.m[0][0]=1,original.m[0][1]=-1; original.m[1][0]=1,original.m[1][1]=0; ans.m[0][0]=ans.m[1][1]=1; ans.m[0][1]=ans.m[1][0]=0; //将ans初始化成2阶矩阵E while(n) { if(n%2==1) ans=mult(ans,original); original=mult(original,original); n/=2; } }两道矩阵快速幂: