HDU3306—Another kind of Fibonacci

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3306

题目意思:一个斐波那契数列的变式,本来是A[n]=A[n-1]+A[n-2],现在变成A[n]=N*A[n-1]+Y*A[n-2]。一个很简单的矩阵快速幂。 S(N) = A(0)2 +A(1)2+……+A(n)2对系数矩阵稍微变化一下就可以了。唯一需要注意的是N和Y可能很大,所以需要先mod一下。

思路:首先先求A[n]^2,因为A[n]=N*A[n-1]+Y*A[n-2],所以A[n]^2=(N*A[n-1])^2+(Y*A[n-2])^2=N^2*A[n-1]^2+Y^2*A[n-2]^2+2NY*A[n-1]*A[n-2]。然后我们可以构造矩阵,求前n项和。

|1       0      0     0|

|x*x  x*x    1     x|

A=  |y*y  y*y    0     0|

|2xy  2xy    0     y|

以上为系数矩阵

代码:

 1 //Author: xiaowuga
 2 #include <bits/stdc++.h>
 3 #define maxx INT_MAX
 4 #define minn INT_MIN
 5 #define inf 0x3f3f3f3f
 6 #define size 4
 7 #define MOD 10007
 8 using namespace std;
 9 typedef long long ll;
10 struct Matrix{
11     ll mat[4][4];
12     void clear(){
13         memset(mat,0,sizeof(mat));
14     }
15     Matrix operator * (const Matrix & m) const{
16         Matrix tmp;
17         for(int i=0;i<size;i++)
18             for(int j=0;j<size;j++){
19                 tmp.mat[i][j]=0;
20                 for(int k=0;k<size;k++){
21                     tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
22                     tmp.mat[i][j]%=MOD;
23                 }
24             }
25         return tmp;
26     }
27 };
28 Matrix POW(Matrix m,ll k){
29     Matrix ans;
30     ans.clear();
31     for(int i=0;i<size;i++) ans.mat[i][i]=1;
32     while(k){
33         if(k&1) ans=ans*m;
34         k/=2;
35         m=m*m;
36     }
37     return ans;
38 }
39 int main() {
40     ios::sync_with_stdio(false);cin.tie(0);
41     ll n,x,y;
42     while(cin>>n>>x>>y){
43         Matrix m;
44         m.clear();
45         m.mat[0][0]=m.mat[3][0]=(x%MOD)*(x%MOD)%MOD;
46         m.mat[0][1]=m.mat[3][1]=(y%MOD)*(y%MOD)%MOD;
47         m.mat[0][2]=m.mat[3][2]=(2*x%MOD)*(y%MOD)%MOD;
48         m.mat[1][0]=m.mat[3][3]=1;
49         m.mat[2][0]=x%MOD;m.mat[2][2]=y%MOD;
50         ll f[4]={1,1,1,2};
51         Matrix ans=POW(m,n-1);
52         ll sum=0;
53         for(int i=0;i<4;i++){
54             sum=(sum+ans.mat[3][i]*f[i])%MOD;
55         }
56         cout<<sum<<endl;
57     }
58     return 0;
59 }

时间: 2024-11-06 23:29:26

HDU3306—Another kind of Fibonacci的相关文章

Another kind of Fibonacci(hdu3306)

Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2353    Accepted Submission(s): 936 Problem Description As we all known , the Fibonacci series : F(0) = 1, F(1) = 1, F(N

hdu3306:Another kind of Fibonacci

A(0)=A(1)=1,A(i)=X*A(i-1)+Y*A(i-2),求S(n)=A(0)^2+A(1)^2+A(2)^2+A(3)^2+--+A(n)^2. 这个矩阵有点毒.. 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 //#include<iostream> 6 using namespace std; 7 8 #de

NYOJ 480 Fibonacci Again!

Fibonacci Again! 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 求第n个斐波那契数是否是一个素数,n为整数 f[n]=f[n-1]+f[n-2] (2<n<30) f[1]=3,f[2]=7 输入 输入整数m,0<m<30,输入-1表示结束输入 输出 假设f[m]是素数 则输出Yes,否则输出No, 每行输出占一行. 例子输入 2 3 例子输出 Yes No #include<stdio.h> int f[35]={0

HDU1848 Fibonacci again and again

Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8198    Accepted Submission(s): 3412 Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1)=1;F(2)=2;

hdu 5167 Fibonacci(DFS)

hdu 5167 Fibonacci 问题描述 斐波那契数列的递归定义如下: Fi=???01Fi?1+Fi?2i = 0i = 1i > 1 现在我们需要判断一个数是否能表示为斐波那契数列中的数的乘积. 输入描述 有多组数据,第一行为数据组数T(T≤100,000). 对于每组数据有一个整数n,表示要判断的数字. 0≤n≤1,000,000,000 输出描述 对于每组数据,如果可以输出"Yes",否则输出"No". 输入样例 3 4 17 233 输出样例

HDU 4099 Revenge of Fibonacci

Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/Others) Total Submission(s): 2027    Accepted Submission(s): 475 Problem Description The well-known Fibonacci sequence is defined as following: Here w

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

HUDJ 1021 Fibonacci Again

Fibonacci Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 36028    Accepted Submission(s): 17385 Problem Description There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n)

Fibonacci数

Fibonacci数 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义为F(n)=1 ...........(n=1或n=2)F(n)=F(n-1)+F(n-2).....(n>2)现要你来求第n个斐波纳奇数.(第1个.第二个都为1) 输入 第一行是一个整数m(m<5)表示共有m组测试数据每次测试数据只有一行,且只有一个整形数n(n<20) 输出 对每组输入n,输出第n个Fibonacci数 实现: package July;