题目描述

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. P2157 [SDOI2009]学校食堂Dining

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  2. mysql中查看一个字段中,有几个逗号

    利用replace.length的内置函数

  3. [Dynamics 365] 关于Currency的一点随笔

    在Dynamics CRM中,如果我们要添加一条Currency记录的话. 可选择的Currency Type有<System> ,<Custorm>两种. 如果选择的是< ...

  4. 20155339平措卓玛 Exp1 PC平台逆向破解(5)M

    20155339平措卓玛 Exp1 PC平台逆向破解(5)M 实践内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖 ...

  5. Luogu P1983 车站分级

    (一周没写过随笔了) 这道题有坑! 看到题目,发现这么明显(??)的要求顺序,还有什么想法,拓扑! 将每条路范围内等级大于等于它的点(不能重复(坑点1))和它连一条边,注意起点终点都要有(坑点2),然 ...

  6. mfc CProgressCtrl

    CProgressCtrl常用属性 CProgressCtrl类常用成员函数 CProgressCtrl代码示例 一.CProgressCtrl控件属性 当我们在处理大程序时,常常需要耗很长时间(比如 ...

  7. 同步、异步、回调执行顺序之经典闭包setTimeout分析

    聊聊同步.异步和回调 同步,异步,回调,我们傻傻分不清楚, 有一天,你找到公司刚来的程序员小T,跟他说:“我们要加个需求,你放下手里的事情优先支持,我会一直等你做完再离开”.小T微笑着答应了,眼角却滑 ...

  8. jersey2 整合 spring + hibernate + log4j2

    整合 spring jersey2 官方还未正式支持 spring4, 但网上有好多支持方案,折腾了一圈后,还是用了 spring3; pom 添加以下依赖配置 <!-- Spring --&g ...

  9. Kafka API: TopicMetadata

    Jusfr 原创,转载请注明来自博客园 TopicMetadataRequest/TopicMetadataResponse 前文简单说过"Kafka是自描述的",是指其broke ...

  10. js的各种正则表达式

    验证各种手机包括成都"028-"开头的座机号验证 if (!(/^(16[8]|13[0-9]|15[0|3|6|7|8|9]|18[7])\d{8}|(028-)\d{7}$/. ...