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