当然很水,分奇偶特征根反推后得通项公式,发现等同于斐波那契即可
幼儿园数学题I
某天,幼儿园学生LZH周测数学时吓哭了,一道题都做不出来。这下可麻烦了他马上就会成为垫底的0分啊。他的期望也不高,做出最简单的第一题就够了
题目是这样的,定义F(n)=((根号5+1)/2)^(n-1) ,当然为了凸显题目的简单当然不能是小数分数或无理数,F(x)因此需要向上取整,当然求F(n)是非常难的!因此幼儿园园长头皮决定简单一点,求下F(x)的前n项和就行了。
输入 一个正整数n(保证1<=n<=2^31-1)
输出 一个正整数S(n) 对1000000007 取余就好了
样例输入1
1
样例输出1
1
样例输入2
2
样例输出2
2
等同于斐波那契数列的前n项和
标程:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #define LL long long #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std; #define N 3 #define inf 1000000007 int n,m=3; struct matrix { LL a[N][N]; void clear() { memset(a,0,sizeof(a)); } void OUT() { fo(i,0,m-1) { fo(j,0,m-1) { cout<<a[i][j]<<' '; }cout<<endl; }cout<<endl; } matrix operator*(const matrix b)const { matrix anss; fo(i,0,m-1) fo(j,0,m-1) { anss.a[i][j]=0; fo(k,0,m-1) { anss.a[i][j]+=a[i][k]*b.a[k][j]; anss.a[i][j]%=inf; } } return anss; } }; matrix I= { 1,0,0, 0,1,0, 0,0,1 }; matrix A= { 1,1,1, 0,1,1, 0,1,0 }; matrix KSM(matrix a,LL k) { matrix ret=I; while(k) { if(k&1)ret=a*ret; a=a*a; k>>=1; } return ret; } int main() { scanf("%d",&n); if(n==1) { cout<<1<<endl; return 0; } matrix ans; ans.a[0][0]=2; ans.a[1][0]=1; ans.a[2][0]=1; ans=KSM(A,n-2)*ans; cout<<ans.a[0][0]<<endl; return 0; }