【全国互虐】Fibonacci矩阵
orz啊又被屠了 人生如此艰难
题意:
给定一个k维的n^k的超立方体 超立方体的元素Ai1,i2,...,ik 的值为f(i1+i2+...+ik-k+1) f为斐波那契数列
求该超立方体的所有元素和
1<=n,k<=10^9
题解:
其实看到数据范围 就大概猜到是矩阵乘法了
但是我考试的时候想了半天还是不知道矩阵乘法怎么搞 - -
其实矩阵乘法比我想象中的厉害多了
这里有个性质 做完一维后 可以把这维压缩成一个点 用这维的和代替
并且压缩后下一维还是满足斐波那契的性质所以可以用同一个矩阵继续乘
那么把开始的[f[1],f[2],sum[1]] 改为[sum[n],sum[n]-f[1]+f[n+1],sum[n]] 继续快速幂即可
但是这样做的时间复杂度是O(klogn)的
其实上面的将[f[1],f[2],sum[1]] 改为[sum[n],sum[n]-f[1]+f[n+1],sum[n]]也是能用矩阵表示出来的orz
具体自己yy下 这样就能求出从这维转到下一维的矩阵是什么样的 这个矩阵的k次方就能求出答案
时间复杂度O(log(nk))
代码
#include <cstdio>
#include <cstring>
typedef long long ll;
struct info{
ll n,m;
ll a[][];
}save,jz,one,st;
const ll mo=;
ll t,n,m;
inline info operator*(info a,info b){
info res;
res.n=a.n,res.m=b.m;
for (ll i=;i<res.n;i++)
for (ll j=;j<res.m;j++){
res.a[i][j]=;
for (ll k=;k<a.m;k++) res.a[i][j]=(res.a[i][j]+a.a[i][k]*b.a[k][j]%mo)%mo;
}
return res;
}
void makeinfo(){
memset(st.a,,sizeof(st.a));
memset(one.a,,sizeof(one.a));
memset(save.a,,sizeof(save.a));
st.n=,st.m=;
st.a[][]=,st.a[][]=,st.a[][]=;
one.n=one.m=save.n=save.m=;
one.a[][]=one.a[][]=one.a[][]=;
save.a[][]=save.a[][]=save.a[][]=save.a[][]=save.a[][]=;
}
info mi(info a,ll b){
info res=one;
for (;b;b>>=){
if (b&) res=res*a;
a=a*a;
}
return res;
}
int main(){
freopen("fibonacci.in","r",stdin);
freopen("fibonacci.out","w",stdout);
scanf("%I64d",&t);
makeinfo();
for (;t;t--){
scanf("%I64d%I64d",&n,&m);
jz=mi(save,n-);
jz.a[][]=jz.a[][]+jz.a[][]-;
jz.a[][]=jz.a[][]+jz.a[][];
jz.a[][]=jz.a[][]+jz.a[][];
jz.a[][]=jz.a[][];
jz.a[][]=jz.a[][];
jz.a[][]=jz.a[][];
jz=mi(jz,m);
jz=st*jz;
printf("%I64d\n",jz.a[][]);
}
fclose(stdin);
fclose(stdout);
}
【全国互虐】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 题解 神奇的卡常题目 ...
- POJ3070 Fibonacci[矩阵乘法]
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
- 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 ...
- HDU 1588 Gauss Fibonacci(矩阵快速幂)
Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)
题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路: 设A = |(1, 1),(1, 0) ...
随机推荐
- 7.cadence原理图后续[原创]
一.网表输出 1.自动编号 输出网表前,不能有问号 -- 效果: ---- -- 效果: 2.DRC检查 输出网表前需要DRC检查 3.网表输出 二.生成BOM表 法1: 法2: --- 点击OK: ...
- C# 正则 获取 Img Src路径
string str = "<form id=\"form1\" runat=\"server\"><div><p> ...
- 浅析JavaScript函数的参数
ECAMScript函数不介意传递进来多少个参数,也不介意传递的参数的类型,即使定义的函数只接受两个参数,当调用该函数时没有传递参数,甚至传递了三个参数等等都无所谓,这是因为在ECAMScript中参 ...
- SQL注入与Java
前面这篇文章介绍了SQL注入,并且主要就PHP的内容做了实验: http://www.cnblogs.com/charlesblc/p/5987951.html 还有这篇文章对处理方案做了介绍(Pre ...
- JS 去除字符串中的空格
1. 去掉字符串前后所有空格: 代码如下: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } 说明: ...
- Bootstrap_组件
一.Glyphicons 字体图标 1.所有可用的图标查看:http://v3.bootcss.com/components/ 2.获取字体图标:我们已经在 环境安装 章节下载了 Bootstrap ...
- HDU 4513 吉哥系列故事——完美队形II
变形的Manacher算法,在扩展的时候要加入限制条件,满足题目中说的从左到中间身高不减. 其他地方倒是没有什么改动.. //#define LOCAL #include <iostream&g ...
- ubuntu16.04 64位server安装php7
You can do the following: sudo apt-get install python-software-properties sudo LC_ALL=C.UTF-8 add-ap ...
- typedef函数指针用法
typedef void(*vp)(); 将vp声明为一个函数指针类型,该类型的指可以针指向一个没有参数,带空返回值的函数. 调用方法vp p;创建一个vp类型的函数指针p void print(vp ...
- [asp.net] 通过JS实现对treeview控件的复选框单选控制。
前端JS代码: //识别不同的浏览器 function getTargetElement(evt) { var elem if (evt.target) { elem = (evt.target.no ...