1040 又见斐波那契 矩阵乘法 快速幂
作者:互联网
链接:https://ac.nowcoder.com/acm/contest/26656/1040
来源:牛客网
题目描述
这是一个加强版的斐波那契数列。给定递推式 求F(n)的值,由于这个值可能太大,请对109+7取模。
输入描述:
第一行是一个整数T(1 ≤ T ≤ 1000),表示样例的个数。18
以后每个样例一行,是一个整数n(1 ≤ n ≤ 10
)。
输出描述:
每个样例输出一行,一个整数,表示F(n) mod 1000000007。示例1
输入
复制4 1 2 3 100
输出
复制1 16 57 558616258
分析
矩阵乘法,还是要对着生成式写初始函数 f 。
//-------------------------代码---------------------------- #define int ll const ll mod = 1e9 + 7; struct Node { ll a[6][6] = { {1,1,1,1,1,1}, {1,0,0,0,0,0}, {0,0,1,3,3,1}, {0,0,0,1,2,1}, {0,0,0,0,1,1}, {0,0,0,0,0,1} }; int p = 6; Node operator* (Node b) { Node x; ms(x.a,0); for(int i = 0;i<p;i++) { for(int j = 0;j<p;j++) { for(int k = 0;k<p;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 -=2 ; while( ans ) { if( ans & 1 ) { x = x * a; } a = a * a ; ans >>= 1; } return x; } void solve(ll n) { if(n == 0 || n == 1) { cout<<n<<endl; return; } Node a; a = quick(a, n); Node f; ms(f.a,0); f.a[0][0] = 1;//写错了。 f.a[1][0] = 0; f.a[2][0] = 8; f.a[3][0] = 4; f.a[4][0] = 2; f.a[5][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) // solve(n); {cin>>n ; solve(n); } return 0; } /*样例区 */ //------------------------------------------------------------
标签:Node,1040,return,ll,while,ans,见斐波,那契,mod 来源: https://www.cnblogs.com/er007/p/16536893.html