【BZOJ3328】PYXFIB 数论+矩阵乘法
【BZOJ3328】PYXFIB
Description
.jpg)
Input
第一行一个正整数,表示数据组数据 ,接下来T行
每行三个正整数N,K,P
Output
T行,每行输出一个整数,表示结果
Sample Input
1 2 3
Sample Output
HINT
.jpg)
题解:首先看到斐波那契数列我们肯定要想到矩阵乘法,但是给出的形式并不能直接求,我们试图将其转化为矩乘的形式。
如果不考虑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
【BZOJ3328】PYXFIB 数论+矩阵乘法的更多相关文章
- 【bzoj4002】[JLOI2015]有意义的字符串 数论+矩阵乘法
题目描述 B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 输入 一行三个整数 b;d;n 输出 一行一个数表示模 7528443412579576937 ...
- ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5667 这题的关键是处理指数,因为最后结果是a^t这种的,主要是如何计算t. 发现t是一个递推式,t(n) = c ...
- Codevs 1305 Freda的道路(矩阵乘法 DP优化)
1305 Freda的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Freda要到Rainbow的城堡去玩了.我们可以认 ...
- Codevs 1482 路线统计(矩阵乘法)
1482 路线统计 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description N个节点的有向图, 求从start到finish刚好经过时 ...
- Codevs 1070 普通递归关系(矩阵乘法)
1070 普通递归关系 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 考虑以下定义在非负整数n上的递归关系 f(n) = f0 ...
- 1250 Fibonacci数列(矩阵乘法)
1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1, fn=fn-1+fn ...
- Codevs 1574 广义斐波那契数列(矩阵乘法)
1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p*an-1+q* ...
- 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...
- HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)
传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...
随机推荐
- 一则Gedit死机引起的错误之解决
一次,虚拟机中CentOS不明原因死机了,终端打开不能操作,SecureCRT和从SecureCRT中运行的托关于本机Windows下的Xming下的gedit也死掉了,无奈只能强制关机.重新启动后其 ...
- VIM复制粘贴大全[转]
用vim这么久 了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开编辑,真的不 爽:上次论坛上有人问到了怎么在vim中使 ...
- MongoDB 之 Capped Collection
MongoDB 支持 Capped Collection,一种固定大小的集合,当集合的大小达到指定大小时,新数据覆盖老数据,MongoDB Replica set 中的 oplog 就是 Capped ...
- Mongodb数据结构及与MySql对比
MySql一直是性价比最高的关系型数据库典范 MongoDB带来了关系数据库以外的NoSql体验. 让我们看一个简单的例子,我们将如何为MySQL(或任何关系数据库)和MongoDB中创建一个数据结构 ...
- mongodb:修改oplog.rs 的大小size
其内容字段说明: ts:操作日志的timestamp t: 未知? h:操作唯一随机值 v:oplog.rs的版本 op:操作类型: i:insert操作 u:update操作 d:delete操作 ...
- nano-sql.js的基本操作
nano-sql是一个小而快的数据库引擎, 他支持联合查询, 分组, 事务, ORM等功能, 支持 内存, indeedDB, Local Storage, WebSQL, Level DB 注意第一 ...
- pycharm pro版本激活
这几天行激活pycharm pro版会遇到问题,license server的网址都不可用了.包括各个网站的百度云的破解资源链接都被和谐了,发现最近jetbrains对盗版管得严. 首次安装在注册界面 ...
- Android ROM 打包记录
android5.1平板或手机应用层一些常用的修改项及目录所在: 1.所以系统应用所在的目录: \alps\packages\apps 2.一些系统属性的定义:并且可以仿写自行定义变量 \alps\b ...
- Netty权威指南之伪异步I/O编程
为了解决同步阻塞I/O一个链路需要一个线程处理问题,对BIO模型做了优化——后端通过一个线程池处理多个客户端的请求接入,设置线程最大值,防止线程并发接入导致的线程耗尽. 当有新的客户端接入时,将客户端 ...
- 使用dshow抓取摄像头数据时,回调函数时间为0的问题
在使用dshow抓取摄像头数据,调用dshow的回调函数,如果发现SampleTime一直为0,如下图 那极有可能是使用RenderStream函数连接Filter时,指定的第一个参数为 PIN_CA ...