幼儿园数学题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;
}