题目描述

Fib定义为Fib(0)=0,Fib(1)=1,对于n≥2,Fib(n)=Fib(n-1)+Fib(n-2)
现给出N,求Fib(2^n).

输入

本题有多组数据。第一行一个整数T,表示数据组数。
接下来T行每行一个整数N,含义如题目所示。
n≤10^15, T≤5

输出

输出共T行,每行一个整数为所求答案。
由于答案可能过大,请将答案mod 1125899839733759后输出

样例输入

2
2
31

样例输出

3
343812777493853


题解

费马小定理+矩阵乘法

傻逼题,根据费马小定理,指数在模 $p-1$ 意义下相等时幂数相等。

因此求出 $2^n$ 在模 $p-1$ 意义下的结果,再用矩阵乘法维护fib数列,求矩阵的 $2^n\ \text{mod}\ (p-1)$ 次幂即可。

模数较大因此使用快(man)速乘,时间复杂度 $O(\log^2n)$ 。

#include <cstdio>
#include <cstring>
#define mod 1125899839733759
typedef long long ll;
inline ll mul(ll x , ll y , ll p)
{
ll ans = 0;
while(y)
{
if(y & 1) ans = (ans + x) % p;
x = (x + x) % p , y >>= 1;
}
return ans;
}
inline ll pow(ll x , ll y , ll p)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = mul(ans , x , p);
x = mul(x , x , p) , y >>= 1;
}
return ans;
}
struct data
{
ll v[2][2];
data() {memset(v , 0 , sizeof(v));}
ll *operator[](int a) {return v[a];}
data operator*(data a)
{
data ans;
int i , j , k;
for(i = 0 ; i < 2 ; i ++ )
for(k = 0 ; k < 2 ; k ++ )
for(j = 0 ; j < 2 ; j ++ )
ans[i][j] = (ans[i][j] + mul(v[i][k] , a[k][j] , mod)) % mod;
return ans;
}
data operator^(ll y)
{
data x = *this , ans;
ans[0][0] = ans[1][1] = 1;
while(y)
{
if(y & 1) ans = ans * x;
x = x * x , y >>= 1;
}
return ans;
}
}A;
int main()
{
int T;
scanf("%d" , &T);
while(T -- )
{
ll n;
scanf("%lld" , &n) , n = pow(2 , n , mod - 1);
A[0][0] = 0 , A[0][1] = A[1][0] = A[1][1] = 1 , A = A ^ n;
printf("%lld\n" , A[1][0]);
}
return 0;
}

【bzoj5118】Fib数列2 费马小定理+矩阵乘法的更多相关文章

  1. Fib数列2 费马小定理+矩阵乘法

    题解: 费马小定理 a^(p-1)=1(mod p) 这里推广到矩阵也是成立的 所以我们可以对(2^n)%(p-1) 然后矩阵乘法维护就好了 模数较大使用快速乘

  2. [bzoj5118]Fib数列2_费马小定理_矩阵乘法

    Fib数列2 bzoj-5118 题目大意:求Fib($2^n$). 注释:$1\le n\le 10^{15}$. 想法:开始一看觉得一定是道神题,多好的题面啊?结果...妈的,模数是质数,费马小定 ...

  3. bzoj5118: Fib数列2(费马小定理+矩阵快速幂)

    题目大意:求$fib(2^n)$ 就是求fib矩阵的(2^n)次方%p,p是质数,根据费马小定理有 注意因为模数比较大会爆LL,得写快速乘法... #include<bits/stdc++.h& ...

  4. HDOJ 4549 M斐波那契数列 费马小定理+矩阵高速幂

    MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是质数 , 依据费马小定理  a^phi( p ) = 1 ( ...

  5. HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)

    M斐波那契数列 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  6. 【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列

    [题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,求出F[ ...

  7. HDOJ 5667 Sequence//费马小定理 矩阵快速幂

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意:如题给了一个函数式,给你a,b,c,n,p的值,叫你求f(n)%p的值 思路:先对函数取以a为 ...

  8. M斐波那契数列(矩阵快速幂+费马小定理)

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  9. LightOJ 1419 – Necklace Polya计数+费马小定理求逆元

    题意:给你n个珠子可以染成k种颜色,旋转后相同的视为一种,问共有几种情况 思路:开始按照一般的排列组合做发现情况太多且要太多运算,查了下发现此题是组合中Polya定理模板题- 学的浅只能大致一说公式S ...

随机推荐

  1. TM1629A驱动程序

    网上看了很多1629驱动程序,很乱,下载了几个整合了一下,下面的程序还没有烧录到开发板里面测试,程序已经做好了,但是这个方案老板不做了,所以只能在这里放着了,留着以后用吧 void TM1629A_W ...

  2. 人人都是产品经理<1.0>

    用了大概2个月的时间,细细的读完了<人人都是产品经理>这本书,受益良多,期间也做了一些笔记,都在前面的博客————products系列中... 当然,更多的收获,还是沉滞在书中的注释,以及 ...

  3. java.lang.RuntimeException: Fail to connect to camera service

    玩自定义照相机的时候出现了:java.lang.RuntimeException: Fail to connect to camera service 讲过百度和Google后知道是权限少加了.(试验 ...

  4. cloudstack secondary vm starting

    等1个小时,差不多可以进入虚拟机,看日志/var/log/cloud.log

  5. jqgrid 选中行触发编辑,切换下一行时验证和异步保存上一行数据

    有时,我们需要批量修改或填写一些相似的数据.可以以jqgrid表来显示,可能的效果如下: 选中触发行编辑参考:jqgrid 单击行启用行编辑,切换行保存原编辑行 本文主要说说验证和异步保存上一条数据的 ...

  6. jquery选择器练习

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  7. odoo权限

    ir.model.access.csv文件这里注意,用户和经理的写法 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create, ...

  8. 有关java(初学笔记)

    JAVA的主要优势:跨平台性,可以在Linux,windows,mac三个系统上运行. 跨平台的核心:JAVA虚拟机--JVM 原理就是将Java语言在这个系统上翻译.JAVA在jvm上运行,jvm进 ...

  9. VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。

    原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...

  10. W25Q128---读写

    占坑! 总结:通信方式是SPI,读数据可以从任何地方读,写数据和擦出数据需要按照页或者扇区或者簇为单位进行. 写数据:一次最多写一页,如果超出一页数据长度,则分几次完成.例如本芯片一个扇区为4096个 ...