【HNOI2019】白兔之舞【组合数学】【矩阵快速幂】【单位根反演】【Chirp Z-Transform】【原根】【MTT】

题意:有一张 (L+1)×n(L+1)\times n(L+1)×n 个点的有向图,每个结点有二元组 (x,y)(0≤x≤L,1≤y≤n)(x,y)~(0\leq x\leq L,1\leq y\leq n)(x,y) (0xL,1yn) 表示。对于所有 (u1,v1),(u2,v2)(u_1,v_1),(u_2,v_2)(u1,v1),(u2,v2),若 u1<u2u_1<u_2u1<u2,则前者向后者连 wv1,v2w_{v_1,v_2}wv1,v2 条边。对所有 0≤t<k0\leq t<k0t<k,你需要求出从 (0,x)(0,x)(0,x) 走模 kkkttt 步到达任意一个第二维为 yyy 的点的方案数。答案对 ppp 取模。

L≤108,n≤3,k≤216,108<p<230,p∈prime,k∣p−1L\leq 10^8,n\leq 3,k\leq 2^{16},10^8<p<2^{30},p\in prime,k\mid p-1L108,n3,k216,108<p<230,pprime,kp1

神奇的题

显然是单位根反演,所以先想办法搞出走到位置 iii 的生成函数。

显然是个矩阵的形式。看成只有 nnn 个点在上面跑,邻接矩阵为 MMM

那么走一步的生成函数为

s(x)=∑i=1∞Mxis(x)=\sum_{i=1}^{\infin}Mx^is(x)=i=1Mxi

答案的生成函数为

f(x)=∑i=0∞(∑j=0L[xj]si(x))xif(x)=\sum_{i=0}^{\infin}\left(\sum_{j=0}^L[x^j]s^i(x)\right)x^if(x)=i=0(j=0L[xj]si(x))xi

看上去很不可做,但实际上中间那坨看起来形式很简单。冷静分析,实际上 MMM 的次数就是 iii,前面的系数就是选 iii 个正整数和不超过 LLL,等价于选 i+1i+1i+1 个正整数不超过 L+1L+1L+1,即

f(x)=∑i=0L(Li)Mixi=(Mx+1)Lf(x)=\sum_{i=0}^L\binom LiM^ix^i\\=(Mx+1)^Lf(x)=i=0L(iL)Mixi=(Mx+1)L

然后就可以单位根反演了

anst=1k∑i=0k−1ωk−it(Mωki+1)Lans_t=\frac 1k\sum_{i=0}^{k-1}\omega_k^{-it}(M\omega_{k}^i+1)^Lanst=k1i=0k1ωkit(Mωki+1)L

我们发现我们只求这个东西的 xxxyyy 列,所以可以设 ai=[(Mωki+1)L]x,ya_i=\left[(M\omega_k^i+1)^L\right]_{x,y}ai=[(Mωki+1)L]x,y

然后

anst=1k∑i=0k−1ωk−itaians_t=\frac 1k\sum_{i=0}^{k-1}\omega_k^{-it}a_ianst=k1i=0k1ωkitai

这是个 CZT 的形式,拆开就可以了

anst=1k∑i=0k−1ωk(i2)+(t2)−(i+t2)aians_t=\frac 1k\sum_{i=0}^{k-1}\omega_k^{\binom i2+\binom t2-\binom{i+t}2}a_ianst=k1i=0k1ωk(2i)+(2t)(2i+t)ai

anst=ωk(t2)k∑i=0k−1ωk(i2)aiωk−(i+t2)ans_t=\dfrac{\omega_k^{\binom t2}}{k}\sum_{i=0}^{k-1}\omega_k^{\binom i2}a_i\omega_k^{-\binom{i+t}2}anst=kωk(2t)i=0k1ωk(2i)aiωk(2i+t)

直接做减法卷积就可以了。

求个原根出来求单位元,然后 MTT 即可。

因为要写的东西太多了,很多地方都写的很浪,仅供参考。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#define MAXN (1<<18)+5
#define double long double
using namespace std;
typedef long long ll;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
int n,k,L,x,y,M,P,g;
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=(ll)ans*a%P;a=(ll)a*a%P,p>>=1;}return ans;
}
const double Pi=acos(-1.0);
struct complex{double x,y;inline complex(const double& x=0,const double& y=0):x(x),y(y){}};
inline complex operator +(const complex& a,const complex& b){return complex(a.x+b.x,a.y+b.y);}
inline complex operator -(const complex& a,const complex& b){return complex(a.x-b.x,a.y-b.y);}
inline complex operator *(const complex& a,const complex& b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
inline complex adj(const complex& a){return complex(a.x,-a.y);}
int l,lim,r[MAXN];
inline void init(){lim=1<<l;for (int i=0;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));}
complex rt[2][24];
void fft(complex* a,int type)
{for (int i=0;i<lim;i++) if (i<r[i]) swap(a[i],a[r[i]]);for (int L=0;L<l;L++){int mid=1<<L,len=mid<<1;complex Wn=rt[type][L+1];for (int s=0;s<lim;s+=len){complex w(1,0);for (int k=0;k<mid;k++,w=w*Wn){complex x=a[s+k],y=w*a[s+mid+k];a[s+k]=x+y,a[s+mid+k]=x-y;}}}if (type) for (int i=0;i<lim;i++) a[i].x/=lim,a[i].y/=lim;
}
complex A[MAXN],B[MAXN],C[MAXN],D[MAXN];
void fmul(int* F,int* G,int n,int m)
{M=sqrt(P);for (l=0;(1<<l)<n+m;l++);init();for (int i=0;i<n;i++) A[i]=complex(F[i]/M,F[i]%M);for (int i=0;i<m;i++) C[i]=complex(G[i]/M,G[i]%M);fft(A,0),fft(C,0);B[0]=adj(A[0]),D[0]=adj(C[0]);for (int i=1;i<lim;i++) B[i]=adj(A[lim-i]),D[i]=adj(C[lim-i]);for (int i=0;i<lim;i++){complex a=A[i],b=B[i],c=C[i],d=D[i];A[i]=(a+b)*complex(0.5,0);B[i]=(a-b)*complex(0,-0.5);C[i]=(c+d)*complex(0.5,0);D[i]=(c-d)*complex(0,-0.5);}for (int i=0;i<lim;i++){complex a=A[i],b=B[i],c=C[i],d=D[i];A[i]=a*c+a*d*complex(0,1);B[i]=b*c+b*d*complex(0,1);}fft(A,1),fft(B,1);for (int i=0;i<n+m-1;i++){ll a=A[i].x+0.5,b=A[i].y+B[i].x+0.5,c=B[i].y+0.5;a%=P,b%=P,c%=P;F[i]=(a*M%P*M%P+b*M%P+c)%P;}
}
struct mat
{int e[3][3];inline mat(const int& v=0){memset(e,0,sizeof(e));for (int i=0;i<3;i++) e[i][i]=v;	}	inline int* operator [](const int& i){return e[i];}inline const int* operator [](const int& i)const{return e[i];}
}W;
inline mat operator +(const mat& a,const mat& b)
{mat c;for (int i=0;i<3;i++)for (int j=0;j<3;j++)c[i][j]=(a[i][j]+b[i][j])%P;return c;
}
inline mat operator *(const mat& a,const mat& b)
{mat c;for (int i=0;i<3;i++)for (int k=0;k<3;k++)for (int j=0;j<3;j++)c[i][j]=(c[i][j]+(ll)a[i][k]*b[k][j])%P;return c;
}
inline mat qpow(mat a,int p)
{mat ans(1);while (p){if (p&1) ans=ans*a;a=a*a,p>>=1;}return ans;
}
inline bool check(int g)
{int x=P-1;for (int i=2;i*i<=x;i++)if (x%i==0){if (qpow(g,(P-1)/i)==1) return false;while (x%i==0) x/=i;}if (x>1&&qpow(g,(P-1)/x)==1) return false; return true;
}
inline int sum(int x){return (ll)x*(x-1)/2%k;}
int F[MAXN],G[MAXN];
int main()
{for (int i=0;i<20;i++){double a=2*Pi/(1<<i);rt[1][i]=adj(rt[0][i]=complex(cos(a),sin(a)));}n=read(),k=read(),L=read(),x=read()-1,y=read()-1,P=read();while (!check(++g));for (int i=0;i<n;i++) for (int j=0;j<n;j++) W[i][j]=read();int Wn=qpow(g,(P-1)/k);for (int i=0,w=1;i<k;i++,w=(ll)w*Wn%P) F[i]=(ll)qpow(W*mat(w)+mat(1),L)[x][y]*qpow(Wn,sum(i))%P;for (int i=0;i<2*k;i++)G[i]=qpow(Wn,k-sum(i));
//	for (int t=0;t<k;t++)
//	{
//		int ans=0;
//		for (int i=0;i<k;i++) ans=(ans+(ll)F[i]*G[i+t])%P;
//		printf("%d ",ans);
//	}
//	puts("");reverse(F,F+k);	fmul(F,G,k,2*k);
//	for (int i=k-1;i<2*k-1;i++) printf("%d ",F[i]);
//	puts("");int t=qpow(k,P-2);for (int i=k-1;i<2*k-1;i++) printf("%lld\n",(ll)F[i]*qpow(Wn,sum(i-k+1))%P*t%P);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员如何学习英语

首先&#xff0c;这不是一篇广告&#xff0c;虽然这个标题很像。其次&#xff0c;我的英语水平也很一般&#xff0c;所以更多的是谈谈一些失败的经历和思考&#xff0c;俗话说&#xff0c;成功的经验不可复制&#xff0c;失败的经验倒可以让我们少走弯路。英语的重要性毋庸置疑…

Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数组aia_iai​&#xff0c;定义一个数组是好的当且仅当对于所有iii都有ai!ia_i!iai​!i。定义f(a)f(a)f(a)表示数组aaa中i<j,aiajiji<j,a_ia_jiji<j,ai​aj​ij的(i,j)(i,j)(i,j)对数。定义…

使用Azure云原生构建博客是怎样一种体验?(上篇)

点击上方蓝字关注“汪宇杰博客”导语https://edi.wang我的网站是在.NET Core 平台上使用 C#语言编写的开源博客系统&#xff0c;运行于微软智慧云 Azure 国际版上。本文将重点介绍 Azure 的各项服务如何为博客带来丝滑体验与保驾护航。历史回顾我博客的历史可以追溯到2003年&am…

AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数组aaa&#xff0c;你要将其分成四份&#xff0c;让这四份中和的最大值−-−最小值最小&#xff0c;输出这个最小值。 n≤2e5,ai≤1e9n\le2e5,a_i\le1e9n≤2e5,ai​≤1e9 思路&#xff1a; 直接枚…

【UOJ574】多线程计算【二元二项式反演】【定积分】【矩阵】【NTT 卷积】

题意&#xff1a;有 nmn\times mnm 的网格&#xff0c;每个结点在 [0,1)[0,1)[0,1) 内的一个随机时刻被点亮。有 hhh 个数对 xi,yix_i,y_ixi​,yi​&#xff0c;对于一个瞬间状态&#xff0c;如果存在一个 xi,yix_i,y_ixi​,yi​ 使得恰好有 xix_ixi​ 行 yiy_iyi​ 列被点亮&a…

Orleans 知多少 | 2. 核心概念一览

Orleans 术语解读上面这张图中包含了Orleans中的几个核心概念&#xff1a;GrainSiloOrleans ClusterOrleans Client从这张图&#xff0c;我们应该能理清他们之间的关系。Grain作为最小的执行单元Silo 是 Grain 的宿主运行环境&#xff0c;用来暴露具体的服务Orleans Server 提供…

Codeforces Round #587 (Div. 3) C. White Sheet 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个白色的矩形和俩个黑色的矩形&#xff0c;问白色被黑色覆盖后还能不能看到。 思路&#xff1a; 经典被简单题卡。 一开始写了个自我感觉很对的做法&#xff0c;结果wa41wa41wa41&#xff0c;检查不…

【UOJ575】光伏元件【网络流建图】【上下界网络流】【费用流】

题意&#xff1a; nnn\times nnn 的 01 矩阵&#xff0c;对于 i∈[1,n]i \in [1,n]i∈[1,n] 有三个参数 li,li,kil_i,l_i,k_ili​,li​,ki​&#xff0c;表示第 iii 行&#xff0c;第 iii 列的 111 的个数分别在 [li,ri][l_i,r_i][li​,ri​] 中&#xff0c;且差的绝对值不超过…

动手造轮子:实现一个简单的 EventBus

动手造轮子&#xff1a;实现一个简单的 EventBusIntroEventBus 是一种事件发布订阅模式&#xff0c;通过 EventBus 我们可以很方便的实现解耦&#xff0c;将事件的发起和事件的处理的很好的分隔开来&#xff0c;很好的实现解耦。微软官方的示例项目 EShopOnContainers 也有在使…

Codeforces Round #733 (Div. 1 + Div. 2) E. Minimax 分情况讨论 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个串&#xff0c;你可以随意安排这个串&#xff0c;使得这个串的每个前缀的kmpkmpkmp数组最大值最小&#xff0c;定义为f(a)f(a)f(a)&#xff0c;并且字典序最小&#xff0c;输出安排之后的串。 n≤1e…

【Ynoi2011】成都七中【树论】【点分树】【离线】【树状数组】

题意&#xff1a;给一棵树&#xff0c;点有颜色&#xff0c;qqq 次询问&#xff0c;每次给定 l,r,xl,r,xl,r,x &#xff0c;求只保留编号在 [l,r][l,r][l,r] 中的点时点 xxx 所在连通块的颜色数。 所有数 ≤105\leq 10^5≤105 题目背景好评 首先所有颜色不同的话就是数连通块…

通过 nginx-proxy 实现自动反向代理和 HTTPS

本章节代码已经上传至 https://github.com/siegrainwong/.NET-Core-with-Docker/tree/master/Part3系列大纲这次我们讲第三篇&#xff1a;用 docker-compose 启动 WebApi 和 SQL Server在容器中集成 Skywalking APM通过 nginx-proxy 对 Portainer、Skywalking、WebApi 实现自动…

P4781 【模板】拉格朗日插值

传送门 把公式实现一下即可&#xff1a; 当xxx连续的时候可以优化为O(N)O(N)O(N)。 // Problem: P4781 【模板】拉格朗日插值 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P4781 // Memory Limit: 125 MB // Time Limit: 1000 ms // // Powered by CP Edi…

【HNOI/AHOI2018】毒瘤【容斥】【虚树/动态dp】

题意&#xff1a;nnn 个点 mmm 条边的连通无向图的独立集个数模 998244353998244353998244353。 n≤105,m≤n10n\leq 10^5,m\leq n10n≤105,m≤n10 为什么标题要把两个算法写一起&#xff1f;因为这两个东西在这类问题上是本质相同的&#xff0c;这也是写这篇博客的原因。 显…

MediatR-进程内的消息通信框架

MediatR是一款进程内的消息订阅、发布框架&#xff0c;提供了Send方法用于发布到单个处理程序、Publish方法发布到多个处理程序&#xff0c;使用起来非常方便。目前支持 .NET Framework4.5、.NET Stardand1.3、.NET Stardand2.0等版本&#xff0c;可跨平台使用。要在项目中使用…

Codeforces Round #586 (Div. 1 + Div. 2) D. Alex and Julian 数学 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个无限个点的坐标轴&#xff0c;一个集合BBB&#xff0c;如果存在∣i−j∣bk|i-j|b_k∣i−j∣bk​的话&#xff0c;那么i,ji,ji,j之间就连边。现在问你至少要从集合BBB中去掉多少个数才能使得连完边之…

【十二省联考2019】字符串问题【后缀自动机】【拓扑排序】

题意&#xff1a;给一个字符串 SSS&#xff0c;以子串的形式给出一些 A 类串和 B 类串以及 mmm 对 A 类串支配 B 类串的关系。求一个总长度最长的 A 类串序列&#xff0c;使得每个串都存在一个 B 类串前缀被后一个串支配。无穷输出 −1-1−1。 ∣S∣,m≤2105|S|,m\leq 2\times …

Codeforces Round #586 (Div. 1 + Div. 2) B. Multiplication Table 思维 + 公式

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个n∗nn*nn∗n的矩阵&#xff0c;每个位置由ai∗aja_i*a_jai​∗aj​得来&#xff0c;主对角线为000&#xff0c;让你求出来aia_iai​。 n≤1e3n\le1e3n≤1e3 思路&#xff1a; 由公式ai,j∗ai,kaj,…

不好意思,这么久没有更新《从零开始掌握ASP.NET Core 》

点击上方蓝字&#xff0c;关注「我们」等了快个月了&#xff0c;终于开始更新了。因为感冒&#xff0c;弄的嗓子有点沙哑。所以停了半个月才是更新&#xff0c;目前一口气更新了12个章节&#xff0c;大家可以耐心观看内容了。《从零开始学ASP.NET Core 》-- 更新通知视频课程更…

【NOI2018】你的名字【后缀自动机】【可持久化线段树合并】【乱搞】

题意&#xff1a;给一个串 SSS&#xff0c;qqq 次询问&#xff0c;每次给定串 TTT 和 l,rl,rl,r &#xff0c;求有多少个本质不同的串是 TTT 的子串而不是 Sl…rS_{l\dots r}Sl…r​ 的子串。 ∣S∣≤5105,q≤105,∑∣T∣≤106|S|\leq 5\times 10^5,q\leq 10^5,\sum|T|\leq 10^…