【BZOJ3328】PYXFIB

Description

Input

第一行一个正整数,表示数据组数据 ,接下来T行
每行三个正整数N,K,P

Output

T行,每行输出一个整数,表示结果

Sample Input

1
1 2 3

Sample Output

1

HINT

题解:首先看到斐波那契数列我们肯定要想到矩阵乘法,但是给出的形式并不能直接求,我们试图将其转化为矩乘的形式。

如果不考虑k的话,我们可以设A表示斐波那契数列的转移矩阵,然后套用二项式定理(这显然对矩阵运算成立),得到$ans=(I+A)^n$。

如果考虑k的限制呢?所求的式子变成$\sum\limits_{i=0}^n[k\mid i]C_n^iF_i$。而题中保证p是质数且p%k=1,即(p-1)%k=0,p-1的出现暗示着我们可能要用到原根。

接下来就是最神的一步:设g是p的原根,$g^{i\frac {p-1} k}=1$当且仅当$k\mid i$,所以令$w=g^{\frac {p-1} k}$,我们构造:$\sum\limits_{j=0}^{k-1}w^{ij}$,这个式子当$k\mid i$时=k,而当$k\nmid i$时,由等比数列求和可知该式=0。所以答案就可以表示成$\sum\limits_{i=0}^{n}\frac 1 k \sum\limits_{j=0}^{k-1}w^{ij}C_n^iF_i$。

下一步也挺神的(其实应该是个我不知道的套路),我们希望对这个式子强行套用二项式定理,但是这个式子本身并不满足二项式定理的形式,所以我们先枚举j,得到$\frac 1 k \sum\limits_{j=0}^{k-1}\sum\limits_{i=0}^nw^{ij}C_n^iF_i$。如果想套用二项式定理,我们需要式子中有一个n-i,于是我们强行把$w^{ij}$变成$w^{nj-(n-i)j}$,然后将$w^{nj}$提出来即可,最后的形式如下:

$\frac 1 k \sum\limits_{j=0}^{k-1}w^{nj}(w^{-j}I+A)^n$。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n,k,P,ans,g,w;
int m;
ll pri[20];
struct M
{ll v[2][2];M () {memset(v,0,sizeof(v));}ll * operator [] (const int &a) {return v[a];}M operator * (const M &a) const{M b;int i,j,k;for(i=0;i<2;i++) for(j=0;j<2;j++)  for(k=0;k<2;k++)  b.v[i][j]=(b.v[i][j]+v[i][k]*a.v[k][j])%P;return b;}
}S,T;
inline ll pm(ll x,ll y)
{ll z=1;while(y){if(y&1)   z=z*x%P;x=x*x%P,y>>=1;}return z;
}
inline void pm(ll y)
{while(y){if(y&1)   S=S*T;T=T*T,y>>=1;}
}
inline void work()
{ans=0,m=0;scanf("%lld%lld%lld",&n,&k,&P);int i;ll t=P-1;for(i=2;i*i<=t;i++)    if(t%i==0){pri[++m]=i;while(t%i==0)  t/=i;}if(t>1)   pri[++m]=t;for(g=2;;g++){for(i=1;i<=m;i++) if(pm(g,(P-1)/pri[i])==1) break;if(i>m)    break;}w=pm(g,(P-1)/k);for(i=0;i<k;i++){S[0][0]=1,S[1][1]=S[0][1]=S[1][0]=0;t=pm(w,P-1-i);T[0][0]=T[1][0]=T[0][1]=1,T[0][0]+=t,T[1][1]=t;pm(n);t=S[0][0];ans=(ans+t*pm(w,n%(P-1)*i))%P;}printf("%lld\n",ans*pm(k,P-2)%P);
}
int main()
{int cas;scanf("%d",&cas);while(cas--)    work();return 0;
}//1 100000000000000000 15232 998244353

转载于:https://www.cnblogs.com/CQzhangyu/p/8289889.html

【BZOJ3328】PYXFIB 数论+矩阵乘法相关推荐

  1. P1306-斐波那契公约数【矩阵乘法,数论】

    正题 题目链接: https://www.luogu.org/problemnew/show/P1306 题目大意 求出第x项和第y项斐波那契额数的最大公约数. 解题思路 首先第x项和第y项斐波那契额 ...

  2. 【codevs1281】Xn数列,矩阵乘法练习

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn ...

  3. c语言定义int 输出4386,C语言 · 矩阵乘法

    问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...

  4. 如何在CPU上优化GEMM矩阵乘法

    如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...

  5. CPU的自动调度矩阵乘法

    CPU的自动调度矩阵乘法 这是一个有关如何对CPU使用自动调度程序的文档. 与依靠手动模板定义搜索空间的基于模板的autotvm不同,自动调度程序不需要任何模板.用户只需要编写计算声明,而无需任何调度 ...

  6. 十个利用矩阵乘法解决的经典题目

    出自matrix67.com 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.     不要以为数学 ...

  7. [学习笔记]矩阵乘法及其优化dp

    1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...

  8. ICML 2021:矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在不做乘 ...

  9. 大佬是怎么优雅实现矩阵乘法的?

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨立交桥跳水冠军 来源丨https://zhuanlan.zhi ...

最新文章

  1. 我在神策做研发 | 成长中的成都研发中心
  2. 电源芯片选择DC/DC还是LDO?《转》
  3. 从java到C++入门
  4. 对new int[]()的理解(转载)
  5. 剑指offer(C++)-JZ79:判断是不是平衡二叉树(数据结构-树)
  6. 破解电信光猫华为HG8120C关闭路由功能方法
  7. django mysql内存泄漏_Django ORM性能优化,数据存取优化
  8. oracle alter database,alter database操作
  9. 阅读记录-统计你的每一次读书和笔‪记
  10. 【计算机视觉】opencv入门学习笔记Part.1
  11. week3 day3 迭代器和生成器
  12. 数据库设计(理论实例)
  13. 加餐0 | 前后端快速入门学习路线
  14. Angular Material 图标素材网址与使用
  15. python3 列表生成式,字典生成式,generator列表生成器的应用
  16. Problem F: 尖兵
  17. 安徽c语言二级真题,安徽省计算机等级二级考试真题C语言
  18. 基于PHP的校园二手交易网站的设计与开发--毕设
  19. 计算机第3次作业中国名城宣传,中国名城宣传(江苏开放大学计算机应用基础作业)(6页)-原创力文档...
  20. LMS.Virtual.Lab.rev13.Win64-ISO 3DVD三维样机仿真平台+Acme CAD Converter 2014 8.6.5.1420 Portable 1CD

热门文章

  1. hand keypoint detection in single images using multiview bootstrapping
  2. install google test on ubuntu
  3. some formulas for bloging
  4. web怎么在圆圈里画半html,在WEB里绘制爱心
  5. VS 2015 64位CMake编译openCV3.1.0必备文件
  6. ros melodic控制真实机械臂之等周期输出插补点
  7. Vue-学生管理功能实例
  8. python按照多个key排序
  9. datatable java排序,Java实现DataTable的过滤,排序,聚合功能
  10. java mac 怎么删_做java服务器开发,并发布到linux,那MacBookPro开发是绝佳工具