幼兒園數學題I【矩陣乘法】
阿新 • • 發佈:2020-12-21
技術標籤:矩陣乘法
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<=231−1)
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;
}