幼儿园数学题II
T i m e Time Time L i m i t : 10000 M S Limit:10000MS Limit:10000MS
M e m o r y Memory Memory L i m i t : 65536 K Limit:65536K Limit:65536K
C a s e Case Case T i m e Time Time L i m i t : 1000 M S Limit:1000MS 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)-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)−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 ) f(n) f(n)的前 n n n项和
Input
输入 一个正整数n(保证 0 < = n < = 2 31 − 1 0<=n<=2^{31}-1 0<=n<=231−1)
Output
输出 一个正整数,表示前 n n n项之和,需要对 1000000007 1000000007 1000000007求余
Sample Input
样例输入1
1
样例输出1
1
样例输入2
2
样例输出2
2
分析:
把原式化为:
f n = ( n + 4 ) ( n − 1 ) / 2 + f 3 + f 4 + f 5 + . . . + f n − 3 + f n − 2 f_n=(n+4)(n-1)/2+f_3+f_4+f_5+...+f_{n-3}+f_{n-2} fn=(n+4)(n−1)/2+f3+f4+f5+...+fn−3+fn−2
再把 ( n + 4 ) ( n − 1 ) / 2 (n+4)(n-1)/2 (n+4)(n−1)/2展开 得到 ( n 2 + 3 n − 4 ) / 2 (n^2+3n-4)/2 (n2+3n−4)/2 化为 n 2 / 2 + 3 n / 2 − 2 n^2/2+3n/2-2 n2/2+3n/2−2
带入原式: f n = f 3 + f 4 + f 5 + . . . + f n − 3 + f n − 2 + n 2 / 2 + 3 n / 2 − 2 f_n=f_3+f_4+f_5+...+f_n-3+f_{n-2}+n^2/2+3n/2-2 fn=f3+f4+f5+...+fn−3+fn−2+n2/2+3n/2−2
我们再对比 f n + 1 f_{n+1} fn+1
同理可得:
f n + 1 = f 3 + f 4 + f 5 + . . . + f n − 3 + f n − 2 + f n − 1 + ( n + 1 + 4 ) ( n + 1 − 1 ) / 2 f_{n+1}=f_3+f_4+f_5+...+f_{n-3}+f_{n-2}+f_{n-1}+(n+1+4)(n+1-1)/2 fn+1=f3+f4+f5+...+fn−3+fn−2+fn−1+(n+1+4)(n+1−1)/2
把 ( n + 1 + 4 ) ( n + 1 − 1 ) / 2 (n+1+4)(n+1-1)/2 (n+1+4)(n+1−1)/2化为 [ ( n + 5 ) n ] / 2 [(n+5)n]/2 [(n+5)n]/2 得出 n 2 / 2 + 5 n / 2 n^2/2+5n/2 n2/2+5n/2
带入原式:
f n + 1 = f 3 + f 4 + f 5 + . . . + f n − 3 + f n − 2 + f n − 1 + n 2 / 2 + 5 n / 2 f_{n+1}=f_3+f_4+f_5+...+f_{n-3}+f_{n-2}+f_{n-1}+n^2/2+5n/2 fn+1=f3+f4+f5+...+fn−3+fn−2+fn−1+n2/2+5n/2
f n + 1 f_{n+1} fn+1相比 f n f_n fn 多出了 f n − 1 + n + 2 f_{n-1}+n+2 fn−1+n+2
∴ f n + 1 ∴f_{n+1} ∴fn+1就等于 f n + f n − 1 + n + 2 f_{n}+f_{n-1}+n+2 fn+fn−1+n+2 也等于 f n + f n − 1 + ( n + 1 ) + 1 f_n+f_{n-1}+(n+1)+1 fn+fn−1+(n+1)+1
那么:
f n = f n − 1 + f n − 2 + n + 1 f_n=f_{n-1}+f_{n-2}+n+1 fn=fn−1+fn−2+n+1
得出这个结论后 我们直接做矩阵乘法即可 与之前一道例题类似
具体思路: l i n k link 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;
}