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 #define LL long long
 9 LL n,x,y;
10 typedef LL mat[6][6];
11 mat a,f,ans;
12 const int mod=10007;
13 void copy(mat &a,mat b)
14 {
15     for (int i=1;i<=4;i++)
16         for (int j=1;j<=4;j++)
17             a[i][j]=b[i][j];
18 }
19 void mul(mat a,mat b,mat &ans)
20 {
21     mat t;memset(t,0,sizeof(t));
22     for (int i=1;i<=4;i++)
23         for (int j=1;j<=4;j++)
24             for (int k=1;k<=4;k++)
25                 t[i][j]=(t[i][j]+a[i][k]*b[k][j]%mod)%mod;
26     copy(ans,t);
27 }
28 void init(mat &a)
29 {
30     memset(a,0,sizeof(a));
31     for (int i=1;i<=4;i++) a[i][i]=1;
32 }
33 void pow(mat a,LL b,mat &ans)
34 {
35     mat tmp,last;copy(tmp,a);init(last);
36     while (b)
37     {
38         if (b&1) mul(last,tmp,last);
39         mul(tmp,tmp,tmp);
40         b>>=1;
41     }
42     copy(ans,last);
43 }
44 int main()
45 {
46     while (~scanf("%lld%lld%lld",&n,&x,&y))
47     {
48         memset(a,0,sizeof(a));
49         a[1][1]=a[1][2]=a[3][2]=1;
50         a[2][2]=x*x%mod;
51         a[2][3]=y*y%mod;
52         a[2][4]=2*x*y%mod;
53         a[4][2]=x;a[4][4]=y;
54         f[1][1]=f[2][1]=f[3][1]=f[4][1]=1;
55         pow(a,n,a);
56         mul(a,f,ans);
57         printf("%lld\n",ans[1][1]);
58     }
59     return 0;
60 }

时间: 2024-11-05 13:32:11

hdu3306:Another kind of Fibonacci的相关文章

杭电oj3306:Another kind of Fibonacci(矩阵快速幂)

Another kind of Fibonacci 题目链接 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 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

Project Euler:Problem 25 1000-digit Fibonacci number

The Fibonacci sequence is defined by the recurrence relation: Fn = Fn?1 + Fn?2, where F1 = 1 and F2 = 1. Hence the first 12 terms will be: F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144 The 12th term, F1

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

UESTC - 278 Fibonacci(矩阵快速幂)

题目: Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, - An alternative formula for the Fibonacci sequenc

BZOJ 2813: 奇妙的Fibonacci

2813: 奇妙的Fibonacci Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 497  Solved: 134[Submit][Status][Discuss] Description Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + Fi-2 (当 i >= 3) pty忽然对这个古老的数列产生了浓厚的兴趣,他想知道:对于某一个Fibonacci数Fi, 有多少个Fj

hdu 1588 Gauss Fibonacci(等比矩阵二分求和)

题目链接:hdu 1588 Gauss Fibonacci 题意: g(i)=k*i+b; f(0)=0f(1)=1f(n)=f(n-1)+f(n-2) (n>=2) 让你求:sum(f(g(i)))for 0<=i<n 题解: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,0,1}, (花括号表示矩阵...) // 也就是fib数的变化矩阵,F(x) = (A^x) * {1,0} = F(b) + (

《算法:第四版》练习1.1部分答案

以下答案纯属个人愚见,作为IT新手,算法代码中难免有逻辑漏洞和其他不足之处,欢迎朋友你点评拍砖,交流争辩能极大开阔思维,愿一起加油进步!^_^ 1.1.19  在计算机上运行以下程序: 1 public class Fibonacci { 2 3 public static long F(int N) { 4 if(0 == N) 5 return 0; 6 if(1 == N) 7 return 1; 8 return F(N - 1) + F(N - 2); 9 } 10 11 public

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

HDU3306Another kind of Fibonacci(简单矩阵快速幂)

哎,本来是想学学矩阵构造的方法的,,突然发现自己不用看直接就会yy构造... 看下右边有什么.. 题目地址:Another kind of Fibonacci AC代码: #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; const int mod=10007; int p[4][4],a[4][4],tmp[4][4]; i