【BZOJ3328】PYXFIB(单位根反演,矩阵快速幂)

题面

BZOJ

题解

首先要求的式子是:\(\displaystyle \sum_{i=0}^n [k|i]{n\choose i}f_i\)。

斐波那契数列如果要快速算显然就只能对应着一个矩阵,所以我们就直接默认\(f_i\)是一个矩阵的形式。

如果没有\([k|i]\)这个东西这个玩意看着就很像一个二项式定义的展开。

实际上二项式定理对于矩阵而言显然是对的,不妨设斐波那契数列的转移矩阵是\(A\),

那么\(\displaystyle (A+I)^n=\sum_{i=0}^n {n\choose i}A^i\),其中\(I\)是单位矩阵。

因为有前面那个东西,所以用单位根反演直接拆:

\[\begin{aligned}
\sum_{i=0}^n[k|i]{n\choose i}f_i&=\sum_{i=0}^n{n\choose i}f_i\frac{1}{k}\sum_{j=0}^{k-1}\omega_k^{ji}\\
&=\frac{1}{k}\sum_{j=0}^{k-1}\sum_{i=0}^n{n\choose i}f_i(\omega^j)^i
\end{aligned}\]

似乎把\(\omega\)一起丢进矩阵里面就可以直接计算了。

(也就是后面那个东西是\((A\omega^j+I)^n\))

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
inline ll read()
{
ll x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
ll n;int K,MOD,g,w,ans;
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
struct Matrix
{
int s[2][2];
void clear(){s[0][0]=s[0][1]=s[1][0]=s[1][1]=0;}
void init(){s[0][0]=s[1][1]=1;s[0][1]=s[1][0]=0;}
int*operator[](int x){return s[x];}
}A,I;
Matrix operator*(Matrix a,Matrix b)
{
Matrix c;c.clear();
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
for(int k=0;k<2;++k)
c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j])%MOD;
return c;
}
Matrix operator+(Matrix a,Matrix b)
{
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
a[i][j]=(a[i][j]+b[i][j])%MOD;
return a;
}
Matrix operator*(Matrix a,int b)
{
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
a[i][j]=1ll*a[i][j]*b%MOD;
return a;
}
Matrix fpow(Matrix a,ll b)
{
Matrix s;s.init();
while(b){if(b&1)s=s*a;a=a*a;b>>=1;}
return s;
}
int fac[100],tot;
int Getg()
{
int x=MOD-1;tot=0;
for(int i=2;i*i<=x;++i)
if(x%i==0)
{
fac[++tot]=i;
while(x%i==0)x/=i;
}
if(x>1)fac[++tot]=x;
for(int i=2;;++i)
{
bool fl=true;
for(int j=1;j<=tot;++j)
if(fpow(i,(MOD-1)/fac[j])==1){fl=false;break;}
if(fl)return i;
}
}
int main()
{
int T=read();I.init();
while(T--)
{
n=read();K=read();MOD=read();
g=Getg();w=fpow(g,(MOD-1)/K);ans=0;
for(int i=0,tw=1;i<K;++i,tw=1ll*tw*w%MOD)
{
A[0][0]=1;A[0][1]=1;A[1][0]=1;A[1][1]=0;
A=fpow(A*tw+I,n);
ans=(0ll+ans+A[0][1]+A[1][1])%MOD;
}
ans=1ll*ans*fpow(K,MOD-2)%MOD;
printf("%d\n",ans);
}
return 0;
}

【BZOJ3328】PYXFIB(单位根反演,矩阵快速幂)的更多相关文章

  1. bzoj3328: PYXFIB(单位根反演+矩阵快速幂)

    题面 传送门 题解 我们设\(A=\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}\),那么\(A^n\)的左上角就是\(F\)的第\(n\)项 所 ...

  2. BZOJ3328 PYXFIB 单位根反演

    题意:求 \[ \sum_{i=0}^n[k|i]\binom{n}{i}Fib(i) \] 斐波那契数列有简单的矩阵上的通项公式\(Fib(n)=A^n_{1,1}\).代入得 \[ =\sum_{ ...

  3. BZOJ 3328: PYXFIB 单位根反演+矩阵乘法+二项式定理

    如果写过 LJJ 学二项式那道题的话这道题就不难了. #include <bits/stdc++.h> #define ll long long #define setIO(s) freo ...

  4. 【XSY2612】Comb Avoiding Trees 生成函数 多项式求逆 矩阵快速幂

    题目大意 本题的满二叉树定义为:不存在只有一个儿子的节点的二叉树. 定义一棵满二叉树\(A\)包含满二叉树\(B\)当且经当\(A\)可以通过下列三种操作变成\(B\): 把一个节点的两个儿子同时删掉 ...

  5. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  6. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  7. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  8. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  9. HDU5950(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...

随机推荐

  1. 中国爬虫违法违规案例汇总github项目介绍

    中国爬虫违法违规案例汇总github项目介绍 GitHub - 本项目用来整理所有中国大陆爬虫开发者涉诉与违规相关的新闻.资料与法律法规.致力于帮助在中国大陆工作的爬虫行业从业者了解我国相关法律,避免 ...

  2. [转]技术比较Agent和Agentless监控优缺点

    本文并非原创,转自:http://wenku.baidu.com/link?url=NGT2NA7Lf6fZSPmcOxFQqL4cYROHlIOJyiWCnGdwv3kljMqub-6zyjgsSw ...

  3. commons-dbutils【不推荐】

    Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装. 一般项目开发过程中,要么选择 ORM框架,要么自己编写DBUtils类+数据库连接池就足够了.

  4. Linux rpm包管理工具

    1.什么是rpm包 是一种编译好的二进制软件包,安装速度快. 2.rpm包命名 el6:软件包用于在Red Hat 6.x, CentOS 6.x, and CloudLinux 6.x进行安装 el ...

  5. LearnOpenGL.PBR.工作流贴图

  6. adb命令之解锁打卡

    adb devicesadb shell input keyevent 26                       按手机电源键adb shell input swipe 400 1080 40 ...

  7. E10【选款式】I don't like that style

    核心句型 I don't like that style. 我不喜欢那个款式 场景对话 A:Look at those shoes. They're really nice. 瞧那双鞋.可真漂亮 B: ...

  8. 第十二周博客作业 <西北师范大学| 周安伟>

    第十二周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/10831971 ...

  9. 并发、并行、同步、异步、全局解释锁GIL、同步锁Lock、死锁、递归锁、同步对象/条件、信号量、队列、生产者消费者、多进程模块、进程的调用、Process类、

    并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到 ...

  10. maven warnning 'build.plugins.plugin.version' is missing

    裝完maven后,package或clean时出错:[WARN] [WARN] Some problems were encountered while building the effective ...