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 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

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

思路见下图:

#include<iostream>
#include<cstring>
using namespace std; const int maxn = 5;
typedef long long LL; struct Matrix{
int matrix[maxn][maxn];
}ori, ans; int n = 4, N, X, Y, m = 10007; void init()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ori.matrix[i][j] = ans.matrix[i][j] = 0;
ori.matrix[0][0] = ori.matrix[2][1] = 1;
ori.matrix[0][1] = ori.matrix[1][1] = X * X % m;
ori.matrix[0][2] = ori.matrix[1][2] = Y * Y % m;
ori.matrix[0][3] = ori.matrix[1][3] = ((2 * X) % m) * Y % m;
ori.matrix[3][1] = X;
ori.matrix[3][3] = Y;
ans.matrix[0][0] = 2;
ans.matrix[1][0] = ans.matrix[2][0] = ans.matrix[3][0] = 1;
} Matrix multiply(Matrix a, Matrix b)
{
Matrix temp;
memset(temp.matrix, 0, sizeof(temp.matrix));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
temp.matrix[i][j] = (temp.matrix[i][j] + ((a.matrix[i][k] * b.matrix[k][j]) % m)) % m;
return temp;
} //矩阵的b次幂
Matrix binaryPow(int b)
{
Matrix temp;
memset(temp.matrix, 0, sizeof(temp.matrix));
for(int i=0;i<n;i++)
temp.matrix[i][i] = 1;
while(b > 0)
{
if(b & 1)
temp = multiply(ori, temp);
ori = multiply(ori, ori);
b >>= 1;
}
return temp;
} int main()
{
//freopen("in.txt","r", stdin);
while(cin>>N>>X>>Y)
{
X %= m;
Y %= m;
init();
Matrix temp = binaryPow(N - 1);
ans = multiply(temp, ans);
cout<<ans.matrix[0][0]<<endl;
}
return 0;
}

最新文章

  1. WCF服务编程
  2. Ubuntu 15.10 x64 安装 Android SDK
  3. javaweb回顾第九篇EL表达式
  4. 输入文本框,当点击enter时,做进一步处理!
  5. c# 结课小结
  6. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试
  7. visualbox使用(二)
  8. 在Fedora 20下编译安装QEMU
  9. CoutDownLatch 多线程同步辅助类
  10. 创建Activity
  11. 重启mysql提示:The server quit without updating PID file问题的解决办法
  12. idea Library XXXXXXXX has broken classes paths
  13. 二、PHP基本语法 - PHP零基础快速入门
  14. Spring加载加密的配置文件
  15. 测试开发之Django——No2.Django的安装以及项目创建
  16. python数据结构与算法 29-1 哈希查找
  17. AndroidUI设计 之 图片浏览器
  18. elasticsearch之kibana安装
  19. printf重定向问题
  20. jmeter链接多台负载机报错

热门文章

  1. ASP.NET MVC4 Web项目中使用Log4Net记录日志到文件和数据库。
  2. 第2节 storm实时看板案例:11、实时看板综合案例工程构建,redis的专业术语
  3. logj4.xml
  4. 修改Xshell字体大小和颜色
  5. Python 动态从文件中导入类或函数的方法
  6. windos常见软件库
  7. 使用windows函数SetWindowsHookEx实现键盘钩子
  8. Eclipse启动选择启动空间
  9. centos6 初次安装成功,未显示eth0网卡的信息
  10. iOS Framework制作流程