斐波那契数列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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值