幼儿园数学题II
\(Time\) \(Limit:10000MS\)\(Memory\) \(Limit:65536K\)\(Case\) \(Time\) \(Limit:1000MS\)
Description
这天,当一头雾水的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\)项和
Input
输入 一个正整数n(保证\(0<=n<=2^{31}-1\))
Output
输出 一个正整数,表示前\(n\)项之和,需要对\(1000000007\)求余
Sample Input
样例输入1
1
样例输出1
1
样例输入2
2
样例输出2
2
分析:
把原式化为:
再把\((n+4)(n-1)/2\) 展开 得到\((n^2+3n-4)/2\) 化为\(n^2/2+3n/2-2\)
带入原式:$$f_n=f_3+f_4+f_5+...+f_n-3+f_{n-2}+n^2/2+3n/2-2$$
我们再对比\(f_{n+1}\)同理可得:
把\((n+1+4)(n+1-1)/2\) 化为\([(n+5)n]/2\) 得出\(n^2/2+5n/2\)
带入原式:
\(f_{n+1}\)相比\(f_n\) 多出了\(f_{n-1}+n+2\)\(∴f_{n+1}\)就等于\(f_{n}+f_{n-1}+n+2\) 也等于\(f_n+f_{n-1}+(n+1)+1\)那么:
得出这个结论后 我们直接做矩阵乘法即可 与之前一道例题类似
具体思路:\(link\)
CODE:
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
const int mod=1e9+7;
long long n;
using namespace std;
struct matrix{
long long n,m;
long long F[11][11];
}A,B,C;
matrix operator *(matrix A,matrix B){
matrix C;
C.n=A.n,C.m=B.m;
for(int i=1;i<=C.n;i++)
for(int j=1;j<=C.m;j++)
C.F[i][j]=0;
for(int k=1;k<=A.m;k++)
for(int i=1;i<=C.n;i++)
for(int j=1;j<=C.m;j++)
C.F[i][j]=(C.F[i][j]+(A.F[i][k]*B.F[k][j])%mod)%mod;
return C;
}
void ksm(long long x){
if(x==1){
B=A;
return;
}
ksm(x>>1);
B=B*B;
if(x&1) B=B*A;
}
int main(){
scanf("%lld",&n);
if(n==1){
printf("1");
return 0;
}
A.n=5,A.m=5;
A.F[1][1]=0,A.F[1][2]=1,A.F[1][3]=0,A.F[1][4]=0,A.F[1][5]=0;
A.F[2][1]=1,A.F[2][2]=1,A.F[2][3]=1,A.F[2][4]=0,A.F[2][5]=0;
A.F[3][1]=0,A.F[3][2]=0,A.F[3][3]=1,A.F[3][4]=0,A.F[3][5]=0;
A.F[4][1]=0,A.F[4][2]=1,A.F[4][3]=0,A.F[4][4]=1,A.F[4][5]=0;
A.F[5][1]=0,A.F[5][2]=1,A.F[5][3]=0,A.F[5][4]=1,A.F[5][5]=1;
ksm(n-1);
C.n=1,C.m=5;
C.F[1][1]=1,C.F[1][2]=1,C.F[1][3]=1,C.F[1][4]=3,C.F[1][5]=1;
C=C*B;
printf("%lld",C.F[1][3]);
return 0;
}