高数Umaru系列(10)——简单题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
题目描述很简单,已知递推式F(n)=a*F(n-1)+b*F(n-2),给定a,b,F(0),F(1)的值以及n,求F(n)。
多组输入。
对于每组输入,输出一个F(n),结果可能会比较大,需要对1000000007取余,即求F(n)%1000000007,每组输出占一行
示例输入
1 1 0 1 42 3 2 3 6
示例输出
3912
提示
来源
Shannon
示例程序
#include <stdio.h>
#include <string.h>
#define P 1000000007
struct matrix
{
long long a[2][2];
}sum,t,key;
void f(int bug)
{
int i,i1,i2;
struct matrix a,b;
memset(key.a[0],0,sizeof(key));
b=t;
if(bug==1)
{
a=sum;
}
else
{
a=t;
}
for(i=0;2>i;i++)
{
for(i1=0;2>i1;i1++)
{
for(i2=0;2>i2;i2++)
{
key.a[i][i1]=(key.a[i][i1]+(a.a[i][i2]*b.a[i2][i1])%P)%P;
}
}
}
if(bug==1)
{
sum=key;
}
else
{
t=key;
}
}
int main()
{
int f0,f1,n,i,i1;
while(scanf("%lld %lld %d %d %d",&t.a[0][0],&t.a[1][0],&f0,&f1,&n)!=EOF)
{
if(n>=2)
{
t.a[0][1]=1;
t.a[1][1]=0;
for(i=0;2>i;i++)
{
for(i1=0;2>i1;i1++)
{
if(i==i1)
{
sum.a[i][i1]=1;
}
else
{
sum.a[i][i1]=0;
}
}
}
n--;
while(n!=0)
{
if(n%2!=0)
{
f(1);
}
f(2);
n=n/2;
}
printf("%lld\n",((f1*sum.a[0][0])%P+(f0*sum.a[1][0])%P)%P);
}
else if(n==1)
{
printf("%d\n",f1);
}
else
{
printf("%d\n",f0);
}
}
return 0;
}
/**************************************
Problem id : SDUT OJ 3359
Code Len : 1675B
Result : Accepted
Take Memory : 288K
Take Time : 0MS
Submit Time : 2016-07-23 16:25:47
**************************************/