1. 程式人生 > 其它 >幼兒園數學題I【矩陣乘法】

幼兒園數學題I【矩陣乘法】

技術標籤:矩陣乘法

D e s c r i p t i o n Description Description

某天,幼兒園學生LZH周測數學時嚇哭了,一道題都做不出來。這下可麻煩了他馬上就會成為墊底的0分啊。他的期望也不高,做出最簡單的第一題就夠了
題目是這樣的,定義

當然為了凸顯題目的簡單當然不能是小數分數或無理數,a(x)因此需要向下取整,當然求a(n)是非常難的!因此幼兒園園長頭皮決定簡單一點,求下a(x)的前n項和就行了。

I n p u t Input Input

輸入 一個正整數n(保證 1 < = n < = 2 31 − 1 1<=n<=2^{31}-1

1<=n<=2311)

O u t p u t Output Output

輸出 一個正整數S(n) 對1000000007 取餘就好了
S(n)為字首和

S a m p l e Sample Sample I n p u t Input Input#1
1
S a m p l e Sample Sample O u t p u t Output Output#1
1
S a m p l e Sample Sample I n p u t Input Input#2
2
S a m p l e Sample Sample O u t p u t Output Output
#2
2

T r a i n Train Train o f of of T h o u g h t Thought Thought

那個公式其實就是斐波那契數列
然後用矩陣乘法邊算數列邊算字首和

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;

const ll mod = 1000000007;

ll n;

struct wh_
{
	ll h[10][10];
}Ans,
A; wh_ operator *(wh_ a, wh_ b)//矩陣乘法 { wh_ c; memset(c.h, 0, sizeof(c.h)); for(int i = 1; i <= 4; ++i) for(int j = 1; j <= 4; j++) for(int k = 1; k <= 4; k++) c.h[i][j] = (c.h[i][j] + a.h[i][k] * b.h[k][j] % mod) % mod; return c; } void power(ll m)//快速冪 { while(m) { if(m & 1)Ans = Ans * A; A = A * A; m >>= 1; } } int main() { scanf("%lld", &n); A.h[1][1] = 0, A.h[1][2] = 1, A.h[1][3] = 0; A.h[2][1] = 1, A.h[2][2] = 1, A.h[2][3] = 1; A.h[3][1] = 0, A.h[3][2] = 0, A.h[3][3] = 1; Ans.h[1][1] = 0, Ans.h[1][2] = 1, Ans.h[1][3] = 0; power(n); printf("%lld", Ans.h[1][3]); return 0; }