1043 公式题(2) 矩阵乘法 快速幂
链接:https://ac.nowcoder.com/acm/contest/26656/1043
来源:牛客网
题目描述
令f(n)=2*f(n-1)+3*f(n-2)+n,f(1)=1,f(2)=2
令g(n)=g(n-1)+f(n)+n*n,g(1)=2
告诉你n,输出g(n)的结果,结果对1e9+7取模
令g(n)=g(n-1)+f(n)+n*n,g(1)=2
告诉你n,输出g(n)的结果,结果对1e9+7取模
输入描述:
多组输入,每行一个整数n(1<=n<=1e9),如果输入为0,停止程序。
输出描述:
在一行中输出对应g(n)的值,结果对1e9+7取模。
备注:
项数极大,朴素算法无法在规定时间内得出结果
分析
花了好久。。最后看别人的,然后过了。。。。好像转移公式写错了,然后从3开始??
//-------------------------代码---------------------------- #define int ll const ll mod = 1e9 + 7; struct Node { ll a[7][7] = { {1,1,0,0,1,2,1}, {0,2,3,0,0,1,0}, {0,1,0,0,0,0,0}, {0,0,1,0,0,0,0}, {0,0,0,0,1,2,1}, {0,0,0,0,0,1,1}, {0,0,0,0,0,0,1} }; Node operator* (Node b) { Node x; ms(x.a,0); for(int i = 0;i<7;i++) { for(int j = 0;j<7;j++) { for(int k = 0;k<7;k++) { x.a[i][j] = x.a[i][j] % mod + this->a[i][k] * b.a[k][j] % mod; x.a[i][j] %= mod; } } } return x; } }; Node quick(Node a,ll ans) { if(ans == 1) { return a; } Node x; ans -- ; while( ans ) { if( ans & 1 ) { x = x * a; } a = a * a ; ans >>= 1; } return x; } void solve(ll n) { if(n == 1) { cout<<2<<endl; return; } if(n == 2) { cout<<8<<endl; rt; } Node a; a = quick(a, n - 2); Node f; ms(f.a,0); f.a[0][0]=8; f.a[1][0]=10; f.a[2][0]=2; f.a[3][0]=1; f.a[4][0]=4; f.a[5][0]=2; f.a[6][0]=1; f = a * f ; ll fin = (f.a[0][0]) % mod; // dbb(f.a[0][0],f.a[1][0]); cout<<fin<<endl; } signed main(){ clapping();TLE; ll n; // int t;cin>>t;while(t -- ) // while(cin>>n) while(cin>>n,n) // cin>>n; solve(n); // { cin >> n ;solve(n ); } return 0; } /*样例区 */ //------------------------------------------------------------

浙公网安备 33010602011771号