POJ3070 矩阵快速幂模板题
2018-01-16 15:15
381 查看
题解:
我学习矩阵快速看的是这个博客:
http://blog.csdn.net/nyist_tc_lyq/article/details/52981353#
时隔3个月再来学这个矩阵快速幂,我以为我当初已经是理解了模板的,果然我还是个笑话,压根只是会套模板,根本不知道是干嘛的玩意这个代码。一直纠结了一早上都不知道为什么会得出可以得到这个结果的,而且为你们可以先看看上面的博客,然后再看下我自己为什么纠结的点然后我得出的的这些解释,可能会对你们有一些帮助。
![](https://img-blog.csdn.net/20180116150651953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU3RhcnRfdG9fY3Jhenk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
以后做矩阵的题就不单单是套模板了,而是应该推出式子,按式子来输出了。接下来就上我在网上学的两个模板吧。
我学习矩阵快速看的是这个博客:
http://blog.csdn.net/nyist_tc_lyq/article/details/52981353#
时隔3个月再来学这个矩阵快速幂,我以为我当初已经是理解了模板的,果然我还是个笑话,压根只是会套模板,根本不知道是干嘛的玩意这个代码。一直纠结了一早上都不知道为什么会得出可以得到这个结果的,而且为你们可以先看看上面的博客,然后再看下我自己为什么纠结的点然后我得出的的这些解释,可能会对你们有一些帮助。
以后做矩阵的题就不单单是套模板了,而是应该推出式子,按式子来输出了。接下来就上我在网上学的两个模板吧。
#include<stdio.h> #include<string.h> #define LL long long int const int MOD=10000; struct node { LL m[2][2]; node() { memset(m,0,sizeof(m)); } }; node cla(node a,node b)//这里可以 node cla(node a,node b,int l) 第三个l表示的是你矩阵的大小,但是这里求斐波那契,只需要2就好了,就不用写了 { node c; for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) if(a.m[i][k]&&b.m[k][j])//剪枝(添条件,设门槛),提高效率,有一个是0,相乘肯定是0 { c.m[i][j]+=a.m[i][k]*b.m[k][j]; c.m[i][j]%=MOD; } return c; } LL POW(LL k) { node a,c; for(int i=0;i<2;i++) c.m[i][i]=1; a.m[0][0]=1,a.m[0][1]=1; a.m[1][0]=1,a.m[1][1]=0; while(k) { if(k%2) c=cla(c,a); a=cla(a,a); 4000 k/=2; } return c.m[0][0]%MOD; } int main() { LL n; while(~scanf("%lld",&n)) { if(n==-1) break; if(n==0) printf("0\n"); else printf("%lld\n",POW(n-1)); } }
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; const int MOD=10000; struct Matrix { long long a[2][2]; Matrix() { memset(a, 0, sizeof(a)); } Matrix operator * (const Matrix y) { Matrix ans; for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) for(int k = 0; k <= 1; k++) ans.a[i][j] =(ans.a[i][j]+a[i][k]*y.a[k][j]%MOD)%MOD; for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) ans.a[i][j] %= MOD; return ans; } void operator = (const Matrix b) { for(int i = 0; i <= 1; i++) for(int j = 0; j <= 1; j++) a[i][j] = b.a[i][j]%MOD; } }; int solve(long long x) { Matrix ans, trs; ans.a[0][0] = ans.a[1][1] = 1; trs.a[0][0] = trs.a[1][0] = trs.a[0][1] = 1; while(x) { if(x&1) ans = ans*trs; trs = trs*trs; x >>= 1; } return ans.a[0][0]; } int main() { int n; while(~scanf("%d", &n)) { if(n==-1) break; if(n==0) { cout <<"0"<< endl; continue; } cout << solve(n-1) << endl; } return 0; }
相关文章推荐
- POJ3070:Fibonacci(矩阵快速幂模板题)
- Fibonacci----poj3070(矩阵快速幂, 模板)
- POJ3070(矩阵快速幂模板)
- poj3070(矩阵快速幂,矩阵乘法)
- hdu6198 number number number(矩阵快速幂模板题)
- HDU 1757 A Simple Math Problem(矩阵快速幂模板)
- [模板] - 矩阵快速幂
- hdu 1005 矩阵快速幂模板题
- 矩阵快速幂模板
- Tr A (矩阵快速幂(模板))
- 【矩阵快速幂模板】
- 【模板】矩阵快速幂
- 模板——矩阵快速幂
- 矩阵快速幂模板
- 矩阵快速幂模板
- 矩阵乘法快速幂模板
- 【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板
- 矩阵快速幂 模板
- hdoj 1588 矩阵快速幂 二分等比数列求和模板
- 矩阵快速幂模板