BZOJ 3328: PYXFIB 解题报告
BZOJ 3328: PYXFIB
题意
给定\(n,p,k(1\le n\le 10^{18},1\le k\le 20000,1\le p\le 10^9,p \ is \ prime,k|(p-1))\),求
\]
其中\(F_{i}\)代表斐波那契数列的第\(i\)项。
首先分析一波题目条件,有个很奇怪的条件\(k|\varphi(p)\)
如果对NTT或者单位根有所了解,我们可以猜到这个条件可以取出单位根来。
\]
然而如果没发现,推一波式子之后也可以发现需要使用单位根。
不过可以先考虑如何处理fib,一个简单的想法是构造矩阵乘法,比如
\]
可以得到
\]
然后我们直接把式子转换成求矩阵
&\sum_{i=0}^{\lfloor\frac{n}{k}\rfloor}\binom{n}{ik}A^{ik}\\
=&\sum_{i=0}^n\binom{n}{i}A^i[k|i]\\
=&\sum_{i=0}^n\binom{n}{i}A^i\frac{1}{k}\sum_{j=0}^{k-1}w_k^{ij}\\
=&\frac{1}{k}\sum_{j=0}^{k-1}\sum_{i=0}^n\binom{n}{i}A^i(w_k^j)^i\\
=&\frac{1}{k}\sum_{j=0}^{k-1}(w_k^jA+I)^n
\end{aligned}
\]
复杂度\(O(Tk\log n)\)
Code:
#include <cstdio>
#include <cctype>
#define ll long long
const int SIZE=1<<21;
char ibuf[SIZE],*iS,*iT;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iS++)
#define gc() getchar()
template <class T>
void read(T &x)
{
x=0;char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
}
ll n;
int k,p;
inline int add(int a,int b){return a+b>=p?a+b-p:a+b;}
#define mul(a,b) (1ll*(a)*(b)%p)
inline int qp(int d,int k)
{
int f=1;
while(k)
{
if(k&1) f=mul(f,d);
d=mul(d,d);
k>>=1;
}
return f;
}
struct Matrix
{
int a,b,c,d;
Matrix friend operator *(Matrix a,Matrix b)
{
Matrix c;
c.a=add(mul(a.a,b.a),mul(a.b,b.c));
c.b=add(mul(a.a,b.b),mul(a.b,b.d));
c.c=add(mul(a.c,b.a),mul(a.d,b.c));
c.d=add(mul(a.c,b.b),mul(a.d,b.d));
return c;
}
}A;
inline Matrix mqp(Matrix d,ll k)
{
Matrix f=d;--k;
while(k)
{
if(k&1) f=f*d;
d=d*d;
k>>=1;
}
return f;
}
int getg(int p)
{
int s[30]={},phi=p-1;
for(int i=2;i*i<=phi;i++)
{
if(phi%i==0)
{
s[++s[0]]=i;
while(phi%i==0) phi/=i;
}
}
if(phi!=1) s[++s[0]]=phi;
for(int i=2;;i++)
{
int flag=1;
for(int j=1;j<=s[0];j++)
if(qp(i,(p-1)/s[j])==1)
{
flag=0;
break;
}
if(flag) return i;
}
}
int main()
{
int T;read(T);
while(T--)
{
read(n),read(k),read(p);
int w=qp(getg(p),(p-1)/k),ans=0;
for(int j=0;j<k;j++)
{
A.a=A.b=A.c=qp(w,j),A.d=1;
A.a=add(A.a,1);
A=mqp(A,n);
ans=add(ans,A.a);
}
printf("%lld\n",mul(ans,qp(k,p-2)));
}
return 0;
}
2019.5.8
BZOJ 3328: PYXFIB 解题报告的更多相关文章
- bzoj 3328: PYXFIB 数论
3328: PYXFIB Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 130 Solved: 41[Submit][Status][Discuss ...
- bzoj 3328 PYXFIB——单位根反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演主要就是有 \( [k|n] = \frac{1}{k}\sum\limit ...
- BZOJ 2959: 长跑 解题报告
2959: 长跑 Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑 ...
- bzoj 3328 PYXFIB —— 单位根反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演,主要用到了 \( [k|n] = \frac{1}{k} \sum\lim ...
- BZOJ 4238 电压 解题报告
BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...
- BZOJ 3159: 决战 解题报告
BZOJ 3159: 决战 1 sec 512MB 题意: 给你一颗\(n\)个点,初始点权为\(0\)的有跟树,要求支持 Increase x y w 将路径\(x\)到\(y\)所有点点权加上\( ...
- BZOJ 4302 Buildings 解题报告
这个题好像很有趣的样子. 题目分析: 房间都是 $1\times k$ 的,也就是一条一条的.这个好像比较显然的样子. 一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Bo ...
- BZOJ 3160 万径人踪灭 解题报告
这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...
- BZOJ 4127 Abs 解题报告
这个题感觉很厉害的样子.. 首先我们注意到一点:每次加的 $d$ 都是非负的. 那么就说明一个数只可能从负数变成非负数并且只会变一次. 所以我们就可以暴力地去改变一个数的正负情况. 然后我们就可以用树 ...
随机推荐
- 微信JS-SDK接口上传图片以及wx.config的配置
最近做的微信网页要实现一个上传图片的功能,倒腾了半天终于搞好了,具体的步骤可以查看微信官方文档https://developers.weixin.qq.com/doc/offiaccount/OA_W ...
- 洛谷P1364 医院设置(Floyd)
题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为l.如上 ...
- CF 1045 H. Self-exploration 解题报告
CF 1045 H. Self-exploration 考虑到串的结构一定是 1...0....1....0.....1... 这样的,而\(01\)与\(10\)在转折点交替出现 首先串长一定是\( ...
- 大碗宽面Alpha第九周会议总结
软件工程每周博客: 本周二我们进行了小组会议,对正在做的评课网站——海大优选进行了整体分析和明确分工.首先我们对整体网页进行了需求分析和框架分析,然后进行了分工,前端同学两人,后端同学两人,文档同学一 ...
- c#获取MAC地址和IP地址
一获取mac地址 1.先添加system.management的dll组件2.添加引用 public string GetMACAddress(){string MoAddress = "& ...
- 埋在MySQL数据库应用中的17个关键问题
出处:https://blog.csdn.net/weixin_42882439 MySQL的使用非常普遍,跟MySQL有关的话题也非常多,如性能优化.高可用性.强一致性.安全.备份.集群.横向扩展. ...
- (转)Maven创建webapp项目无法修改web版本的问题
maven创建的web app,默认使用的servlet版本是2.3,默认不支持JSTL,为了默认支持JSTL表达式,需要升级servlet到3.0 转:http://blog.sina.com.cn ...
- webpack构建缓存机制-hash介绍
前言 浏览器为了优化体验,会有缓存机制.如果浏览器判断当前资源没有更新,就不会去服务端下载,而是直接使用本地资源.在webpack的构建中,我们通常使用给文件添加后缀值来改名以及提取公共代码到不会改变 ...
- SPSS输出的结果都要写到文章中吗
SPSS输出的结果都要写到文章中吗 经常有人问到,SPSS输出的结果都要写到文章中吗?文章中应该写什么呢?比如,均值.中位数.众数.标准差.百分位数.最小值.最大值等等,都要出现在文章中吗?洋洋洒洒那 ...
- Ubuntu下实现Nginx+Tomcat实现负载均衡
先说一下为什么写这个文章,在性能测试过程中,我们可能会关注很多指标,比如CPU.IO.网络.磁盘等,通过这些指标大致可以判断哪个环节遇到了性能瓶颈,但是当这些指标无法判断出性能瓶颈时,我们可能就需要对 ...