您的位置:首页 > 其它

hdu3306 Another kind of Fibonacci 构造矩阵

2014-07-25 19:02 459 查看


Another kind of Fibonacci

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 1506 Accepted Submission(s): 574



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 <= 231 – 1

X : 2<= X <= 231– 1

Y : 2<= Y <= 231 – 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

6
196


Author

wyb

Source

HDOJ Monthly Contest – 2010.02.06

Recommend

wxl | We have carefully selected several similar problems for you: 3308 3307 3309 3314 3310

粘一个构造矩阵的题,以后就当模板用了

#include <iostream>
#include <stdio.h>
#include <cstring>
#define Mod 10007
using namespace std;
const int MAX=4;

typedef  struct
{
int m[MAX][MAX];
} Matrix;
Matrix P= {1,1,0,0,
0,0,0,0,
0,1,0,0,
0,0,0,0
};
Matrix I= {1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
};
Matrix matrixmul(Matrix a,Matrix b) //矩阵乘法
{
int i,j,k;
Matrix c;
for(i=0; i<MAX; i++)
for(j=0; j<MAX; j++){
c.m[i][j]=0;
for(k=0; k<MAX; k++)
c.m[i][j]+=(a.m[i][k]* b.m[k][j])%Mod;
c.m[i][j]%=Mod;
}
return c;
}
Matrix quickpow(long long n)
{
Matrix m=P,b=I;
while(n>=1){
if(n&1)b=matrixmul(b,m);
n=n>>1;
m=matrixmul(m,m);
}
return b;
}
int main()
{
int n,x,y,sum;
Matrix b;
while(cin>>n>>x>>y){
sum=0;
x=x%Mod;
y=y%Mod;
P.m[1][1]=(x*x)%Mod;
P.m[1][2]=(y*y)%Mod;
P.m[1][3]=(2*x*y)%Mod;
P.m[3][1]=x;
P.m[3][3]=y;
b=quickpow(n);
for(int i=0; i<4; i++)
sum+=b.m[0][i]%Mod;
cout<<sum%Mod<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: