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矩阵的更多相关文章

  1. hdu 1588(Fibonacci矩阵求和)

    题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...

  2. BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...

  3. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  4. poj 3070 Fibonacci (矩阵快速幂乘/模板)

    题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring& ...

  5. poj 3070 Fibonacci 矩阵快速幂

    Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...

  6. HDU 3306 Another kind of Fibonacci(矩阵+ll超时必须用int&输入必须取模&M必须是int类型)

    Another kind of Fibonacci [题目链接]Another kind of Fibonacci [题目类型]矩阵+ll超时必须用int&输入必须取模&M必须是int ...

  7. POJ3070 Fibonacci[矩阵乘法]【学习笔记】

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  8. HDU 1588 Gauss Fibonacci(矩阵快速幂)

    Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  9. HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)

    题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路:  设A = |(1, 1),(1, 0) ...

随机推荐

  1. android backlight

    背光设置是在:设置->声音和显示->亮度,通过进度条来设置的. 文件:packages/apps/Settings/src/com/android/settings/BrightnessP ...

  2. python-unexpected content storage modification出错

    提示以上错误,然后在pycharm中的文件内容和实际内容不一致 去我的文档-.PyCharm-system_cache,全部删除

  3. 51nod1406 与查询

    这题卡I/O...dp一下... #include<cstdio> #include<cstring> #include<cctype> #include<a ...

  4. kafka迁移与扩容

    参考官网site: http://kafka.apache.org/documentation.html#basic_ops_cluster_expansion https://cwiki.apach ...

  5. HDU 2577 How to Type (DP,经典)

    题意: 打字游戏,求所按的最少次数.给出一个串,其中有大小写,大写需要按下cap键切换到大写,或者在小写状态下按shift+键,这样算两次,打小写时则相反.注意:在打完所有字后,如果cap键是开着的, ...

  6. Python [Leetcode 350]Intersection of Two Arrays II

    题目描述: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, ...

  7. C与C++的区别无随时更新

    C没有calss类,只有结构体struct class A;  在C中这样写就是错误的,C没有关键字class C的字符指针不会自动开辟内存空间,必须对这个指针指向的地址手动开辟空间后才可以写入数据. ...

  8. 【英语】Bingo口语笔记(6) - 表示“迷茫”

  9. Android 手写Binder 教你理解android中的进程间通信

    关于Binder,我就不解释的太多了,网上一搜资料一堆,但是估计还是很多人理解的有困难.今天就教你如何从 app层面来理解好Binder. 其实就从我们普通app开发者的角度来看,仅仅对于androi ...

  10. 如何使用java中的对象

    使用java中的对象,分2步: 1.创建一个对象: 2.使用对象的属性和方法. 见下面的示例代码: package com.imooc; //1.定义一个类 public class Telphone ...