bzoj 3328 PYXFIB——单位根反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328
单位根反演主要就是有
\( [k|n] = \frac{1}{k}\sum\limits_{i=0}^{k-1}w_{k}^{i*n} \)
如果 k | n ,转 n 下就会是 1 ;不然用等比数列求和公式可知是 0 。
一般是构造一个 \( f(x) = ( 1+x )^n \) 之类的,来求含有组合数的式子。比如
\( \sum\limits_{i=0}^{n}C_{n}^{i*k} = \sum\limits_{i=0}^{n}C_{n}^{i}[ i | k ] \)
\( = \frac{1}{k}\sum\limits_{i=0}^{n}C_{n}^{i}\sum\limits_{j=0}^{k-1}w_{k}^{j*i} \)
\( = \frac{1}{k}\sum\limits_{j=0}^{k-1}\sum\limits_{i=0}^{n}C_{n}^{i}w_{k}^{j*i} \)
\( = \frac{1}{k}\sum\limits_{j=0}^{k-1}(1+w_{k}^{j})^n \)
所以设 \( f(x) = ( 1+x )^n \) ,求 k 次 \( f( w_{k}^{j} ) \) 就行。
对于这道题,为了凑一个二项式的形式,把 \( F[i] \) 看作斐波那契递推矩阵 A 的 \( A^{i}[0][0] \) ,就有
\( ans = \frac{1}{k}\sum\limits_{j=0}^{k-1}\sum\limits_{i=0}^{n}C_{n}^{i}A^{i}w_{k}^{j*i} \)
有两个 i 次却没有 n-i 次,不能直接套。那个 \( w_{k}^{j*i} \) 的 \( w_{k}^{j} \) 与 i 无关,所以设 \( f(x) \) 的时候考虑把 \( w_{k}^{j} \) 作为 \( x \) 。
如果 \( f(x) = ( A+I*x )^n \) ,那么 \( f( w_{k}^{j} ) = \sum\limits_{i=0}^{n}C_{n}^{i}A^{i}w_{k}^{j*(n-i)} \)
想把 \( w_{k}^{j*(n-i)} \) 变成 \( w_{k}^{j*i} \) ,只要令 \( f(x) = x^{-n} ( A+I*x )^n \) ,然后求 \( f( w_{k}^{-j} ) \) 即可。
注意 n 是 long long 。
找原根是枚举 phi( mod ) 的质因子,然后看 \( g^{\frac{phi(mod)}{pri}} \) 。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=2e4+,K=;
ll n;int k,mod,g,wn;
void upd(int &x){x>=mod?x-=mod:;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
void fnd_g()
{
int pri[K],cnt=,p=mod-,d=p;////p=phi(mod)=mod-1!!
for(int i=;i*i<=d;i++)
if(d%i==)
{pri[++cnt]=i;while(d%i==)d/=i;}
if(d>)pri[++cnt]=d;
for(g=;;g++)
{
bool flag=;
for(int i=;i<=cnt;i++)if(pw(g,p/pri[i])==){flag=;break;}
if(flag)break;
}
}
struct Mtr{
int a[][];
Mtr(){memset(a,,sizeof a);}
Mtr operator* (const Mtr &b)const
{
Mtr c;
for(int i=;i<=;i++)
for(int k=;k<=;k++)
for(int j=;j<=;j++)
c.a[i][j]=(c.a[i][j]+(ll)a[i][k]*b.a[k][j])%mod;
return c;
}
}A,I;
Mtr pw(Mtr x,ll k)//ll!!!
{Mtr ret=I;while(k){if(k&)ret=ret*x;x=x*x;k>>=;}return ret;}
int main()
{
A.a[][]=A.a[][]=A.a[][]=;
I.a[][]=I.a[][]=;
int T;scanf("%d",&T);
while(T--)
{
scanf("%lld%d%d",&n,&k,&mod);fnd_g();
int ans=,wn=pw(g,(mod-)-(mod-)/k),ml=(mod--n%(mod-))%(mod-);
for(int i=,w=;i<k;i++,w=(ll)w*wn%mod)
{
Mtr t=A;t.a[][]+=w;t.a[][]+=w;upd(t.a[][]);upd(t.a[][]);
t=pw(t,n);
ans=(ans+(ll)t.a[][]*pw(w,ml))%mod;
}
ans=(ll)ans*pw(k,mod-)%mod;
printf("%d\n",ans);
}
return ;
}
bzoj 3328 PYXFIB——单位根反演的更多相关文章
- bzoj 3328 PYXFIB —— 单位根反演
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演,主要用到了 \( [k|n] = \frac{1}{k} \sum\lim ...
 - BZOJ 3328: PYXFIB 单位根反演+矩阵乘法+二项式定理
		
如果写过 LJJ 学二项式那道题的话这道题就不难了. #include <bits/stdc++.h> #define ll long long #define setIO(s) freo ...
 - 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- ...
 - bzoj 3328: PYXFIB 数论
		
3328: PYXFIB Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 130 Solved: 41[Submit][Status][Discuss ...
 - BZOJ3328 PYXFIB 单位根反演
		
题意:求 \[ \sum_{i=0}^n[k|i]\binom{n}{i}Fib(i) \] 斐波那契数列有简单的矩阵上的通项公式\(Fib(n)=A^n_{1,1}\).代入得 \[ =\sum_{ ...
 - bzoj 3328 : PYXFIB
		
Discription Input 第一行一个正整数,表示数据组数据 ,接下来T行每行三个正整数N,K,P Output T行,每行输出一个整数,表示结果 Sample Input 1 1 2 3 S ...
 - 【BZOJ3328】PYXFIB(单位根反演,矩阵快速幂)
		
[BZOJ3328]PYXFIB(单位根反演,矩阵快速幂) 题面 BZOJ 题解 首先要求的式子是:\(\displaystyle \sum_{i=0}^n [k|i]{n\choose i}f_i\ ...
 - bzoj3328: PYXFIB(单位根反演+矩阵快速幂)
		
题面 传送门 题解 我们设\(A=\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}\),那么\(A^n\)的左上角就是\(F\)的第\(n\)项 所 ...
 - UOJ#450. 【集训队作业2018】复读机  排列组合 生成函数 单位根反演
		
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做“单位根反演”,它在 FFT 的时候用到过: $$\frac 1 ...
 
随机推荐
- GPS数据解析
			
1.摘要 GPS模块使用串口通信,那么它的的数据处理本质上还是串口通信处理,只是GPS模块的输出的有其特定的格式,需要字符串处理逻辑来解析其含义.如何高效的处理从GPS模块接收到的数据帧,是GPS驱动 ...
 - Linux笔记 #06# 在VPS上自建Git服务
			
参考: GitHub Help: Connecting to GitHub with SSH 廖雪峰的官方网站: 搭建Git服务器 菜鸟教程: Git 服务器搭建 1. 安装记录(可能有错...) 本 ...
 - zabbix监控路由器
			
在路由器上添加团体名: snmp-server enable traps snmp-server community XXXX rw 1.使用Getif查看路由器端口信息 getif-2.31
 - Stitching模块中focalsFromHomography初步研究
			
在Stitching模块中,通过“光束法平差”的时候,有一个步骤为“通过单应矩阵估算摄像头焦距”,调用的地方为: , )); ] ]; d2 ] ]) ] ]); v1 ] ] ...
 - 2018-2019-1 20189215 《Linux内核原理与分析》第四周作业
			
<庖丁解牛>第三章书本知识总结 计算机的三大法宝 存储程序计算机 函数调用堆栈 中断 操作系统的两把宝剑 中断上下文的切换--保存现场和恢复现场 进程上下文的切换 Linux内核源码的目录 ...
 - HttpClient 4.5.3 get和post请求
			
HttpCilent 4.5.3 域名购买.com 后缀好域名 https://mi.aliyun.com/shop/38040 GET请求 CloseableHttpClient httpCilen ...
 - Redis之Set 集合
			
Redis Set 集合 Set 就是一个集合,集合的概念就是一堆不重复值的组合.利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据. 比如在 微博应用中,可以将一个用户所有的关注人 ...
 - 自动生成makefile
			
原文 http://www.laruence.com/2009/11/18/1154.html 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实 ...
 - pybedtools --bedtools的python包
			
http://daler.github.io/pybedtools/ 用个下面这个 >>> fn = pybedtools.example_filename('test.fa') & ...
 - java学习之浅谈多线程4--SwingWorker
			
GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行.如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务.为了解决这个问题,可以运行费时的任务来处理单独线程中的事件.Swin ...