【HDOJ 1005】 Number Sequence
原谅我贴个水题。。。攒了一年的'恩怨'终于了解了 b( ̄▽ ̄)d
去年就接触过矩阵快速幂 线代太弱 看他们代码没参悟透。。可能真是悟性太差了。。
然后一只以为矩阵快速幂是很叼的东西(不过确实很叼) 太高深 再没敢碰。。有毒啊…………
直到最近比赛(VJ)出现矩阵快速幂的频率太高了 今下午又来一道 金巨巨看我万般费解 上来一张纸 一支笔 一个Fibonacci
妥妥的把矩阵快速幂给我讲懂了 学好线代是多么的重要。。。(~﹃~)~zZ
回来找了这么个题练了练手 自己写写就是感觉不一样 太有成就感了 弱渣的第一个矩快
丢水题代码跑掉ε=ε=ε=(~ ̄▽ ̄)~
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef struct Matrix { int mx[2][2]; void Init(int a,int b) { mx[0][0] = a; mx[0][1] = b; mx[1][0] = 1; mx[1][1] = 0; } void Out() { for(int i = 0; i < 2; ++i) { for(int j = 0; j < 2; ++j) printf("%d ",mx[i][j]); puts(""); } } struct Matrix operator * (const struct Matrix a)const { struct Matrix x; memset(x.mx,0,sizeof(x.mx)); for(int i = 0; i < 2; ++i) for(int j = 0; j < 2; ++j) for(int k = 0; k < 2; ++k) x.mx[i][j] = (x.mx[i][j]+mx[i][k]*a.mx[k][j])%7; return x; }; }Matrix; Matrix pow(Matrix mx,int n) { Matrix ans; ans.mx[0][0] = ans.mx[1][1] = 1; ans.mx[0][1] = ans.mx[1][0] = 0; while(n) { if(n&1) ans = ans*mx; mx = mx*mx; n >>= 1; } return ans; } int main() { int n,a,b; while(~scanf("%d %d %d",&a,&b,&n) &&a) { if(n == 1) { puts("1"); continue; } Matrix mx; mx.Init(a,b); mx = pow(mx,n-2); //mx.Out(); printf("%d\n",(mx.mx[0][0]+mx.mx[0][1])%7); } return 0; }