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))\),求

\[\sum_{i=0}^{\lfloor\frac{n}{k}\rfloor}\binom{n}{ik}F_{ik}
\]

其中\(F_{i}\)代表斐波那契数列的第\(i\)项。


首先分析一波题目条件,有个很奇怪的条件\(k|\varphi(p)\)

如果对NTT或者单位根有所了解,我们可以猜到这个条件可以取出单位根来。

\[w_k=g^{\frac{p-1}{k}}
\]

然而如果没发现,推一波式子之后也可以发现需要使用单位根。

不过可以先考虑如何处理fib,一个简单的想法是构造矩阵乘法,比如

\[A=\begin{bmatrix}1&1\\1& 0\end{bmatrix}
\]

可以得到

\[A^i=\begin{bmatrix}F_i&F_{i-1}\\\dots&\dots\end{bmatrix}
\]

然后我们直接把式子转换成求矩阵

\[\begin{aligned}
&\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 解题报告的更多相关文章

  1. bzoj 3328: PYXFIB 数论

    3328: PYXFIB Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 130  Solved: 41[Submit][Status][Discuss ...

  2. bzoj 3328 PYXFIB——单位根反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演主要就是有 \( [k|n] = \frac{1}{k}\sum\limit ...

  3. BZOJ 2959: 长跑 解题报告

    2959: 长跑 Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑 ...

  4. bzoj 3328 PYXFIB —— 单位根反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演,主要用到了 \( [k|n] = \frac{1}{k} \sum\lim ...

  5. BZOJ 4238 电压 解题报告

    BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...

  6. BZOJ 3159: 决战 解题报告

    BZOJ 3159: 决战 1 sec 512MB 题意: 给你一颗\(n\)个点,初始点权为\(0\)的有跟树,要求支持 Increase x y w 将路径\(x\)到\(y\)所有点点权加上\( ...

  7. BZOJ 4302 Buildings 解题报告

    这个题好像很有趣的样子. 题目分析: 房间都是 $1\times k$ 的,也就是一条一条的.这个好像比较显然的样子. 一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Bo ...

  8. BZOJ 3160 万径人踪灭 解题报告

    这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...

  9. BZOJ 4127 Abs 解题报告

    这个题感觉很厉害的样子.. 首先我们注意到一点:每次加的 $d$ 都是非负的. 那么就说明一个数只可能从负数变成非负数并且只会变一次. 所以我们就可以暴力地去改变一个数的正负情况. 然后我们就可以用树 ...

随机推荐

  1. MariaDB 插入查询

    在本章中,我们将学习如何在表中插入数据. 将数据插入表需要INSERT命令. 该命令的一般语法是INSERT,后跟表名,字段和值. 查看下面给出的一般语法 - INSERT INTO tablenam ...

  2. linux su su-的区别

    su只是切换用户. su - 切换用户并切换shell环境. su another pwd后为/home/current su - another pwd后为/home/another

  3. 【NOIP2019模拟11.01】Game(贪心+线段树)

    Description: ​ 小 A 和小 B 在玩一个游戏,他们两个人每人有

  4. JavaScript 六种继承方式

    title: JS的六种继承方式 date: 2017-06-27 05:55:49 tags: JS categories: 学习 --- 继承是面向对象编程中又一非常重要的概念,JavaScrip ...

  5. String StringBuffer BufferBuilder区别

    String 是一个字符串常量,即该对象一旦被创建之后是不可以进行更改的 StringBuffer StringBuilder 是一个字符串变量 StringBuffer 是非线程安全的 但是Stri ...

  6. mapreduce求共同好友

    逻辑分析 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的) A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E: ...

  7. 新手指南:DVWA-1.9全级别教程之SQL Injection

    *本文原创作者:lonehand,转载须注明来自FreeBuf.COM 目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版本,且没有针 ...

  8. UML的类型

    分类 UML从考虑系统的不同角度出发,定义了用例图.类图.对象图.包图.状态图.活动图.序列图.协作图.构件图.部署图等10种图. 常见的UML图有用例图(Use Case Diagram).类图(C ...

  9. WPF 依赖附加属性

    附加属性的本质是一个依赖属性,与普通的依赖属性区别: 1:注册方法名不一样,如 DependencyProperty.RegisterAttached 2:没有普通的属性包装器,而是通过get和set ...

  10. python中datetime模块中strftime/strptime函数

    f==format p==parse 1.获取当前时间(日期格式) from datetime import datetime datetime.now()#输出 datetime.datetime( ...