HDU3306 Another kind of Fibonacci 矩阵
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - HDU3306
题意概括
A0=1,A1=1,AN=X*AN-1+Y*AN-2(N>=2).求SN,SN=A02+A12+…+An2.
题解
这题是用矩阵做的,一看(sou)就知道。
设si为前i项的答案。
如果要求第i项的ai那么是很简单的。
构建矩阵:
ai-1 ai
ai-2 0 y
ai-1 1 x
但是好像没用。
没错,的确没用。
我们从二次项考虑:
si =si-1+ai2
=si-1+(xai-1+yai-2)2
=si-1+x2ai-12+y2ai-22+2xyai-1ai-2
那么对于ak2形式的已经可以完成递推了。但是有一个棘手的东西,就是akak-1怎么完成递推?
我们继续推导:
akak-1=(xak-1+yak-2)ak-1
=xak-12+yak-1ak-2
我们发现ak-12和ak-1ak-2这两个其实可以按照之前推出来的推,而且不影响后面的。
于是,我们可以构建递推矩阵:
si ai2 ai-12 aiai-1
si-1 1 0 0 0
ai-12 x2 x2 1 x
ai-22 x2 y2 0 0
ai-1ai-2 2xy 2xy 0 y
意义:
si = si-1+x2ai-12+y2ai-22+2xyai-1ai-2
ai2 = x2ai-12+y2ai-22+2xyai-1ai-2
ai-1 = ai-12
aiai-1 = xai-12+ yai-1ai-2
那么原始矩阵的第一行就是
s1 a12 a02 a1a0
算出sn,就是把这个原始矩阵乘上n-1个递推矩阵。
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int mod=10007,m=4;
struct Mat{
int v[m][m];
Mat (){}
Mat (int x){
(*this).set(x);
}
void print(){
for (int i=0;i<m;i++,puts(""))
for (int j=0;j<m;j++)
printf("%5d ",v[i][j]);
puts("");
}
void set(int x){
memset(v,0,sizeof v);
if (x==1)
for (int i=0;i<m;i++)
v[i][i]=1;
}
Mat operator * (Mat x){
Mat ans(0);
for (int i=0;i<m;i++)
for (int j=0;j<m;j++)
for (int k=0;k<m;k++)
ans.v[i][j]=(ans.v[i][j]+v[i][k]*x.v[k][j])%mod;
return ans;
}
void operator *= (Mat x){
(*this)=(*this)*x;
}
}M,Md;
Mat MatPow(Mat x,int y){
Mat ans(1),now=x;
while (y){
if (y&1)
ans*=now;
now*=now;
y>>=1;
}
return ans;
}
int n,x,y;
int main(){
while (~scanf("%d%d%d",&n,&x,&y)){
x%=mod,y%=mod;
M.set(0);
int newi[m]={2,1,1,1};
int newd[m][m]={{1 ,0 ,0,0},
{x*x%mod ,x*x%mod ,1,x},
{y*y%mod ,y*y%mod ,0,0},
{2*x*y%mod ,2*x*y%mod ,0,y}};
memcpy(M.v[0],newi,sizeof newi);
memcpy(Md.v,newd,sizeof newd);
Md=MatPow(Md,n-1);
M*=Md;
printf("%d\n",M.v[0][0]);
}
return 0;
}
HDU3306 Another kind of Fibonacci 矩阵的更多相关文章
- hdu 1588(Fibonacci矩阵求和)
题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...
- BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...
- hdu3306 Another kind of Fibonacci【矩阵快速幂】
转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187670.html 题目链接:http://acm.hdu.edu.cn/showproblem. ...
- POJ3070 Fibonacci[矩阵乘法]
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
- 【全国互虐】Fibonacci矩阵
orz啊又被屠了 人生如此艰难 题意: 给定一个k维的n^k的超立方体 超立方体的元素Ai1,i2,...,ik 的值为f(i1+i2+...+ik-k+1) f为斐波那契数列 求该超立方体的所有元素 ...
- poj 3070 Fibonacci (矩阵快速幂乘/模板)
题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring& ...
- poj 3070 Fibonacci 矩阵快速幂
Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...
- HDU 3306 Another kind of Fibonacci(矩阵+ll超时必须用int&输入必须取模&M必须是int类型)
Another kind of Fibonacci [题目链接]Another kind of Fibonacci [题目类型]矩阵+ll超时必须用int&输入必须取模&M必须是int ...
- POJ3070 Fibonacci[矩阵乘法]【学习笔记】
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
随机推荐
- WebStrom设置默认浏览器
- 20155228 2016-2017-2 《Java程序设计》第7周学习总结
20155228 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 Lambda 方法参考的特性,在重用现有的API上扮演了重要的角色.重用现有方法操作,可以避 ...
- 第14月第30天 svn 撤销ignore revert
1. 直接到被ignore的位置,执行: svn add <你被ignore的文件名> --no-ignore –no-ignore是取消忽略 如果是add目录,你可以: svn add ...
- Poj3696 The Lukiest Number
传送门 Solution 懒得写啦 Code #include<iostream> #include<cstdio> #include<cmath> #define ...
- jquery 学习(三) - 遍历操作
HTML代码 <p>1111</p> <p>1111</p> <p>1111</p> <p>1111</p&g ...
- composer设计原理与基本用法
原文地址:http://blog.turn.tw/?p=1039 COMPOSER進階原理:PHP命名空間與PSR-0 http://blog.turn.tw/?p=1122 Moving PHP ...
- Django开发笔记三
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.基于类的方式重写登录:views.py: from ...
- cartographer 安装问题
安装主要参考hitcm教程: http://www.cnblogs.com/hitcm/p/5939507.html 这里只说安装过程中遇到的问题, ceres-solver 与 eigen3 版本不 ...
- C++读写TXT文件中的string或者int型数据以及string流的用法
对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstre ...
- 【C++】结构体、联合体大小计算
struct结构体大小计算 struct A { char a; int b; char c; } 这个结构体中,char占据1字节,int占据4字节,char占据1字节,而这组数据结构的大小是12字 ...