斐波那契数列VI(原创题)

幼儿园数学题II

这天,当一头雾水的LZH同学在考场上痛哭的时候,一旁的YMW早就如切菜一样cut掉了简单至极的第一题,风轻云淡的冲击着满分,然而最后一道题着实难道了他,毕竟是幼儿园副园长树皮和著名毒瘤秋彪为了防止人AK而出的,可是YMW作为ACrush的著名粉丝,向来以AK为目标,永不言败,而他能不能AK就看你了

题目是酱紫的,f(n)-f(3)-f(4)-f(5)-...-f(n-3)-f(n-2)=(n+4)(n-1)/2,f(1)=1,f(2)=1

f(n)的前n项和

 

输入 一个正整数n(保证0<=n<=2^31-1

输出 一个正整数,表示这个图形的整点个数,需要对1000000007求余

 

样例输入1

1

样例输出1

1

样例输入2

2

样例输出2

2


首先把左边的减号整理到右边,为了凑Sn两边加上S(n-1),然后猜测通项公式为f(n)=f(n-1)+f(n-2)+q+p然后用前面几项发现解不出来,再次猜测为一个变量和一个常量,变量构成等差数列,最终解出来f(n)=f(n-1)+f(n-2)+n+1然后矩阵计算S(n)即可

标程:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define LL long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
#define N 5
#define inf 1000000007
int n,m=5;

struct matrix
{
	LL a[N][N];
	void clear()
	{
		memset(a,0,sizeof(a));
	}
	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,0,
	0,1,0,0,0,
	0,0,1,0,0,
	0,0,0,1,0,
	0,0,0,0,1
};
matrix A=
{
	1,1,1,1,1,
	0,1,1,1,1,
	0,1,0,0,0,
	0,0,0,1,1,
	0,0,0,0,1
};

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=
	{
		2,0,0,0,0,
		1,0,0,0,0,
		1,0,0,0,0,
		3,0,0,0,0,
		1,0,0,0,0
	};
	ans=KSM(A,n-2)*ans;
	cout<<ans.a[0][0]<<endl;
	return 0;
}


你可能感兴趣的:(数学,Matrix)