Description
函数 f:Z+→Zf:Z+→Z。已知 f(1),f(2)f(1),f(2) 的值,且对于任意 x>1x>1,有 f(x+1)=f(x)+f(x−1)+sin(πx2)f(x+1)=f(x)+f(x−1)+sin(πx2)。
求 f(n)f(n) 的值。
Input
多组数据。(数据组数 T≤100T≤100)
每组数据包含 33 个不超过 109109 的正整数,分别代表 f(1),f(2)f(1),f(2) 和 nn 的值。
Output
输出 f(n)mod(109+7)f(n)mod(109+7)。每组输出末尾有换行符。
Sample Input
1 2 3
1 2 5
Sample Output
3
7
这题用到了矩阵快速幂,之前一直都没有接触过,借这道题学习一下,代码是同学拿来学习的
#include<stdio.h>
#include<string.h>
#include<bits/stdc++.h>
using namespace std;
struct Matrix
{
long long m[4][4];
};
long long SMod=(long long)100000007;
Matrix Mul(Matrix a,Matrix b)
{
Matrix c;
memset(c.m,0,sizeof c.m);
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
c.m[i][j]+=(long long)((long long)(a.m[i][k]*b.m[k][j])%SMod+SMod)%SMod;
return c;
}
Matrix fastm(Matrix a,int n)
{
Matrix res;
memset(res.m,0,sizeof(res.m));
res.m[0][0]=res.m[1][1]=res.m[2][2]=1;
res.m[3][3]=1;
while(n)
{
if(n&1)
res=Mul(res,a);
n>>=1;
a=Mul(a,a);
}
return res;
}
int main()
{
int n;
long long a1,a2;
Matrix ma;
ma.m[0][0]=1;
ma.m[0][1]=0;
ma.m[0][2]=1;
ma.m[0][3]=1;
ma.m[1][0]=1;
ma.m[1][1]=0;
ma.m[1][2]=0;
ma.m[1][3]=0;
ma.m[2][0]=0;
ma.m[2][1]=1;
ma.m[2][2]=0;
ma.m[2][3]=0;
ma.m[3][0]=0;
ma.m[3][1]=0;
ma.m[3][2]=1;
ma.m[3][3]=0;
while(~scanf("%lld%lld%lld",&a1,&a2,&n))
{
a1%=SMod;
a2%=SMod;
long long a3=((a1+a2)%SMod+SMod)%SMod;
long long a4=((a2+a3-1)%SMod+SMod)%SMod;
if(n==1)
cout<<a1<<endl;
else if(n==2)
cout<<a2<<endl;
else if(n==3)
cout<<a3<<endl;
else if(n==4)
cout<<a4<<endl;
else
{
Matrix ans=fastm(ma,n-4);
long long re=(long long)(((long long)((long long)ans.m[0][0]*a4+(long long)ans.m[0][1]*a3+(long long)ans.m[0][2]*a2+(long long)ans.m[0][3]*a1))%SMod+SMod)%SMod;
cout<<re<<endl;
}
}
return 0;
}