Another kind of Fibonacci
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2963 Accepted Submission(s): 1184
Problem Description
As we all known , the Fibonacci series : F(0) = 1, F(1) = 1, F(N) = F(N - 1) + F(N - 2) (N >= 2).Now we define another kind of Fibonacci : A(0) = 1 , A(1) = 1 , A(N) = X * A(N - 1) + Y * A(N - 2) (N >= 2).And we want to Calculate S(N) , S(N) = A(0)
2 +A(1)
2+……+A(n)
2.
Input
There are several test cases.
Each test case will contain three integers , N, X , Y .
N : 2<= N <= 2 31 – 1
X : 2<= X <= 2 31– 1
Y : 2<= Y <= 2 31 – 1
Each test case will contain three integers , N, X , Y .
N : 2<= N <= 2 31 – 1
X : 2<= X <= 2 31– 1
Y : 2<= Y <= 2 31 – 1
Output
For each test case , output the answer of S(n).If the answer is too big , divide it by 10007 and give me the reminder.
Sample Input
2 1 1 3 2 3
Sample Output
6196
Author
wyb
Source
Recommend
wxl | We have carefully selected several similar problems for you: 3308 3307 3309 3314 3310
题解:
构造矩阵后进行矩阵乘法。
代码:(要改成 long long后才能过)
#include<bits/stdc++.h>
using namespace std;
int n,x,y,i,j,k,a[5][5],b[5][5],c[5][5];
int main(){
while(~scanf("%d%d%d",&n,&x,&y)){
memset(b,0,sizeof(b));
b[1][1]=1;b[2][1]=x*x%10007;b[3][1]=y*y%10007;b[4][1]=2*x*y%10007;
b[1][2]=0;b[2][2]=b[2][1];b[3][2]=b[3][1];b[4][2]=b[4][1];
b[2][3]=1;b[2][4]=x%10007;b[4][4]=y%10007;
if(n==0)printf("1\n");
else if(n==1)printf("2\n");
else{
n-=1;
a[1][1]=2;a[1][2]=1;a[1][3]=1;a[1][4]=1;
while(n){
if(n%2){
memset(c,0,sizeof(c));
for(i=1;i<=1;i++)
for(j=1;j<=4;j++)
for(k=1;k<=4;k++)
c[i][j]+=a[i][k]*b[k][j];
for(i=1;i<=4;i++)a[1][i]=c[1][i]%10007;
}
memset(c,0,sizeof(c));
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
for(k=1;k<=4;k++)
c[i][j]+=b[i][k]*b[k][j];
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)b[i][j]=c[i][j]%10007;
n/=2;
}
printf("%d\n",a[1][1]);
}
}
}