【BZOJ3328】PYXFIB 数论+矩阵乘法
【BZOJ3328】PYXFIB
Description
Input
第一行一个正整数,表示数据组数据 ,接下来T行
每行三个正整数N,K,P
Output
T行,每行输出一个整数,表示结果
Sample Input
1 2 3
Sample Output
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 数论+矩阵乘法相关推荐
- P1306-斐波那契公约数【矩阵乘法,数论】
正题 题目链接: https://www.luogu.org/problemnew/show/P1306 题目大意 求出第x项和第y项斐波那契额数的最大公约数. 解题思路 首先第x项和第y项斐波那契额 ...
- 【codevs1281】Xn数列,矩阵乘法练习
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn ...
- c语言定义int 输出4386,C语言 · 矩阵乘法
问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...
- 如何在CPU上优化GEMM矩阵乘法
如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...
- CPU的自动调度矩阵乘法
CPU的自动调度矩阵乘法 这是一个有关如何对CPU使用自动调度程序的文档. 与依靠手动模板定义搜索空间的基于模板的autotvm不同,自动调度程序不需要任何模板.用户只需要编写计算声明,而无需任何调度 ...
- 十个利用矩阵乘法解决的经典题目
出自matrix67.com 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质. 不要以为数学 ...
- [学习笔记]矩阵乘法及其优化dp
1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...
- ICML 2021:矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在不做乘 ...
- 大佬是怎么优雅实现矩阵乘法的?
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨立交桥跳水冠军 来源丨https://zhuanlan.zhi ...
最新文章
- 我在神策做研发 | 成长中的成都研发中心
- 电源芯片选择DC/DC还是LDO?《转》
- 从java到C++入门
- 对new int[]()的理解(转载)
- 剑指offer(C++)-JZ79:判断是不是平衡二叉树(数据结构-树)
- 破解电信光猫华为HG8120C关闭路由功能方法
- django mysql内存泄漏_Django ORM性能优化,数据存取优化
- oracle alter database,alter database操作
- 阅读记录-统计你的每一次读书和笔记
- 【计算机视觉】opencv入门学习笔记Part.1
- week3 day3 迭代器和生成器
- 数据库设计(理论实例)
- 加餐0 | 前后端快速入门学习路线
- Angular Material 图标素材网址与使用
- python3 列表生成式,字典生成式,generator列表生成器的应用
- Problem F: 尖兵
- 安徽c语言二级真题,安徽省计算机等级二级考试真题C语言
- 基于PHP的校园二手交易网站的设计与开发--毕设
- 计算机第3次作业中国名城宣传,中国名城宣传(江苏开放大学计算机应用基础作业)(6页)-原创力文档...
- LMS.Virtual.Lab.rev13.Win64-ISO 3DVD三维样机仿真平台+Acme CAD Converter 2014 8.6.5.1420 Portable 1CD
热门文章
- hand keypoint detection in single images using multiview bootstrapping
- install google test on ubuntu
- some formulas for bloging
- web怎么在圆圈里画半html,在WEB里绘制爱心
- VS 2015 64位CMake编译openCV3.1.0必备文件
- ros melodic控制真实机械臂之等周期输出插补点
- Vue-学生管理功能实例
- python按照多个key排序
- datatable java排序,Java实现DataTable的过滤,排序,聚合功能
- java mac 怎么删_做java服务器开发,并发布到linux,那MacBookPro开发是绝佳工具