#loj 3058 [HNOI2019] 白兔之舞

单位根反演思博题

模数是乱给的记得整个任意模数ntt

k为p-1的约数意味着一定存在k次单位根,设g是p的原根则\(w_{k}^{1}=g^{\frac{k-1}{p}}\)

既然k次单位根存在自然考虑单位根反演了

\(f(i)\)表示跳了i步并且停在了第二维为y的顶点的方案数

\(st\)表示初始向量而\(A\)表示转移矩阵,那么有

\[f(i)={n \choose i}(st×A^i)(y)\]

那么可以构造数列\(f\)的一般生成函数\(F(z)=\sum_{k}f(k)z^k\)

现在先让我们考虑如何求出\(F(z)\)中恰好是k的倍数的项之和,即求出

\[\sum_{i}[i|k]{n \choose i}(st×A^i)(y)\]

\[\sum_{i}\sum_{j}\omega_{k}^{ij}{n \choose i}(st×A^i)(y)\]

\[\sum_{i}\sum_{j}\omega_{k}^{ij} {n \choose i}(st×A^i)(y)\]

\[\sum_{j}\sum_{i} {n \choose i}(\omega_{k}^{ij}A^i)(y)\]

\[\sum_{j}(st×(\sum_{i} {n \choose i}(\omega_{k}^{j}A)^i))(y)\]

\[\sum_{j}(st×(1+\omega_{k}^{j}A)^n)(y)\]

看起来就很好算了吧

啊,如果现在要求模k是某个特定的值怎么办呢?

很简单啊,把f数列整体平移若干个单位就可以了

为了方便起见设\(g(j)=(st×(1+\omega_{k}^{j}A)^n)(y)\)

如果我们现在处理的生成函数是\(F(z)z^t\)的话,我们的式子应该长这样

\[\sum_{j}g(j)\omega_{k}^{tj}\]

那么如何对于每一个t处理出上面的东西呢?

教练我会多点求值!

大常数\(O(nlog^2n)\)肯定是凉的

这其实是任意长度fft,有一个\(O(nlogn)\)的优秀做法

具体来讲借助了这个恒等式

\[tj={t+j \choose 2}-{t \choose 2}-{j \choose 2}\]

那么现在我们要求的东西就变成了

\[\omega_{k}^{-{t \choose 2}}\sum_{j}\frac{g(j)}{\omega_{k}^{{j \choose 2}}}\omega_{k}^{{t+j \choose 2}}\]

\(p(n)=\frac{g(n)}{q(n)},q(n)=\omega_{k}^{{n \choose 2}}\)

则我们算的就是

\[\omega_{k}^{-{t \choose 2}}\sum_{i-j=t}g(j)q(i)\]

显然是个差卷积,随便fft几下就行了

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;const int N=262144+10;const int D=18;
typedef long long ll;typedef double db;const db pi=acos(-1.0);
const int P=32768;const int SF=15;const int msk=32767;ll PP;ll mod;
inline ll po(ll a,ll p){ll r=1;for(;p;p>>=1,a=a*a%mod)if(p&1)r=r*a%mod;return r;}
namespace poly
{struct cmp{db r;db v;friend cmp operator +(cmp a,cmp b){return (cmp){a.r+b.r,a.v+b.v};}friend cmp operator -(cmp a,cmp b){return (cmp){a.r-b.r,a.v-b.v};}friend cmp operator *(cmp a,cmp b){return (cmp){a.r*b.r-a.v*b.v,a.r*b.v+a.v*b.r};}void operator /=(const db& b){r/=b;v/=b;}}tr[N],tr1[N],tr2[N],tr3[N],tr4[N],rt[2][20][N];int rv[20][N];ll m13[N],m24[N],m14[N],m23[N];inline void pre(){for(int d=1;d<=D;d++)for(int i=0;i<(1<<d);i++)rv[d][i]=(rv[d][i>>1]>>1)|((i&1)<<(d-1));for(int d=1,t=1;d<=D;d++,t<<=1)for(int i=0;i<(1<<d);i++)rt[0][d][i]=(cmp){cos(i*pi/t),sin(i*pi/t)};for(int d=1,t=1;d<=D;d++,t<<=1)for(int i=0;i<(1<<d);i++)rt[1][d][i]=(cmp){cos(i*pi/t),-sin(i*pi/t)};PP=(ll)P*P%mod;}inline void fft(cmp* a,int len,int d,int o){for(int i=0;i<len;i++)if(i<rv[d][i])swap(a[i],a[rv[d][i]]);int i;cmp * w;for(int k=1,j=1;k<len;k<<=1,j++)for(int s=0;s<len;s+=(k<<1))for(i=s,w=rt[o][j];i<s+k;++i,++w){cmp a1=a[i+k]*(*w);a[i+k]=a[i]-a1;a[i]=a[i]+a1;}if(o)for(int i=0;i<len;i++)a[i]/=len;}inline void dbdft(ll* a,int len,int d,cmp* op1,cmp* op2){for(int i=0;i<len;i++)tr[i]=(cmp){(db)(a[i]>>SF),(db)(a[i]&msk)};fft(tr,len,d,0);tr[len]=tr[0];for(cmp* p1=tr,*p2=tr+len,*p3=op1;p1!=tr+len;++p1,--p2,++p3)(*p3)=(cmp){p1->r+p2->r,p1->v-p2->v}*(cmp){0.5,0};for(cmp *p1=tr,*p2=tr+len,*p3=op2;p1!=tr+len;++p1,--p2,++p3)(*p3)=(cmp){p1->r-p2->r,p1->v+p2->v}*(cmp){0,-0.5};}inline void dbidft(cmp* a,int len,int d,ll* op1,ll* op2){fft(a,len,d,1);for(int i=0;i<len;i++)op1[i]=(ll)(a[i].r+0.5)%mod;for(int i=0;i<len;i++)op2[i]=(ll)(a[i].v+0.5)%mod;}cmp tst[N];inline void mul(ll* a,ll* b,ll* c,int len,int d){dbdft(a,len,d,tr1,tr2);dbdft(b,len,d,tr3,tr4);for(int i=0;i<len;i++)tr[i]=tr1[i]*tr3[i]+(cmp){0,1}*tr2[i]*tr4[i];dbidft(tr,len,d,m13,m24);for(int i=0;i<len;i++)tr[i]=tr1[i]*tr4[i]+(cmp){0,1}*tr2[i]*tr3[i];dbidft(tr,len,d,m14,m23);for(int i=0;i<len;i++)c[i]=(m13[i]*PP+(m14[i]+m23[i])*P+m24[i])%mod;}
}
namespace calcg
{int zhi[N];int ct;int nu[N];int divs[N];int hd;inline bool ck(int g){for(int i=1;i<=hd;i++)if(divs[i]!=mod-1&&po(g,divs[i])==1)return false;return true;}inline void dfs(int cur,int nw){if(cur==ct+1){divs[++hd]=nw;return;}for(int i=0;i<=nu[cur];i++,nw*=zhi[cur])dfs(cur+1,nw);}inline int solve(){ll phi=mod-1;for(ll i=2;i*i<=phi;i++)if(phi%i==0){zhi[++ct]=i;while(phi%i==0)nu[ct]++,phi/=i;}if(phi!=1)zhi[++ct]=phi,nu[ct]=1;dfs(1,1);for(int g=2;g<=mod-1;g++)if(ck(g))return g;return -1;}
}
int S;
struct mar
{ll mp[4][4];inline ll * operator [](const int& x){return mp[x];}mar(){for(int i=0;i<4;i++)for(int j=0;j<4;j++)mp[i][j]=0;}friend mar operator *(mar a,mar b){mar c;for(int i=1;i<=S;i++)for(int k=1;k<=S;k++)for(int j=1;j<=S;j++)(c[i][j]+=a[i][k]*b[k][j])%=mod;return c;}
}st,trs,ori;ll gen;ll omg;
ll f[N];ll sw[N];int n;int k;int l;int x;int y;
ll res[N];ll ans[N];
inline ll ctwo(ll n){return ((ll)n*(n-1)/2)%(mod-1);}
int main()
{scanf("%d%d%d%d%d%lld",&n,&k,&l,&x,&y,&mod);S=n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%lld",&ori[i][j]);poly::pre();gen=calcg::solve();omg=po(gen,(mod-1)/k);for(int i=0;i<=2*k;i++)sw[i]=po(omg,ctwo(i));for(int t=0;t<k;t++){st=mar();st[1][x]=1;ll wkt=po(omg,t);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)trs[i][j]=ori[i][j]*wkt%mod;for(int i=1;i<=n;i++)(trs[i][i]+=1)%=mod;for(int p=l;p;p>>=1,trs=trs*trs)if(p&1)st=st*trs;f[t]=st[1][y];}for(int t=0;t<k;t++)(f[t]*=po(sw[t],mod-2))%=mod;for(int t=0;t<k;t++)if(t<(k-t))swap(f[t],f[k-t]);int len=1;int d=0;while(len<k+k)len<<=1,d++;poly::mul(f,sw,res,len,d);for(int i=0;i<k;i++)(ans[i]=res[i+k]*po(k*sw[i]%mod,mod-2))%=mod;ans[k]=ans[0];for(int i=k;i>=1;i--)printf("%lld\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/sweetphoenix/p/10833517.html

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

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

相关文章

工程代码_Egret开发笔记(二)基础工程代码阅读

代码目录结构在Egret Wing中打开上一节中我们创建的项目工程&#xff0c;查看代码目录结构&#xff0c;Forward在如下图中标记了各个目录的及关键文件的用途。代码阅读理解接下来我们从web入口一步一步阅读初始代码。首先打开index.html文件&#xff0c;我们看到index文件内容如…

知晓云助力小程序开发

小程序开发遇到瓶颈虽然腾讯提供了小程序解决方案&#xff0c;https://cloud.tencent.com/solution/la。但是对于普通开发者或者小企业的开发人员来说&#xff0c;购买域名&#xff0c;网站备案、部署SSL证书&#xff0c;安装会话服务器。业务逻辑上要使用数据库&#xff0c;缓…

Cracer渗透-windows基础(系统目录,服务,端口,注册表)

系统目录C:\Windows\system32\config\SAM (保存系统密码) 无法正常修改&#xff0c;可以进入PE系统进行修改&#xff08;先备份在清空&#xff09;利用结束后&#xff0c;再将之前备份的恢复C:\Windows\System32\drivers\hosts&#xff08;域名解析文件&#xff09;hosts欺骗&a…

java--xml文件读取(SAX)

SAX解析原理&#xff1a; 使用Handler去逐个分析遇到的每一个节点 SAX方式解析步奏&#xff1a; 创建xml解析需要的handler&#xff08;parser.parse(file,handler)&#xff09; package com.imooc_xml.sax.handler;import java.util.ArrayList;import org.xml.sax.Attributes…

imp命令导入指定表_Sqoop 使用shell命令的各种参数的配置及使用方法

点击上方蓝色字体&#xff0c;选择“设为星标”回复”资源“获取更多资源本文作者&#xff1a;Sheep Sun本文链接&#xff1a;https://www.cnblogs.com/yangxusun9/p/12558683.html大数据技术与架构点击右侧关注&#xff0c;大数据开发领域最强公众号&#xff01;暴走大数据点击…

ik分词和jieba分词哪个好_Pubseg:一种单双字串的BiLSTM中文分词工具

中文分词是中文自然语言处理中的重要的步骤&#xff0c;有一个更高精度的中文分词模型会显著提升文档分类、情感预测、社交媒体处理等任务的效果[1]。Pubseg是基于BiLSTM中文分词工具&#xff0c;基于ICWS2005PKU语料训练集训练而成&#xff0c;其优点在于在ICWS2005-PKU语料下…

小白做淘客店铺新玩法

微信淘客在朋友圈刷了将近两个月。有些大咖赚得盆满钵满&#xff0c;有些小白交了不少学费。有人日入几千几万&#xff0c;也有入不敷出。在此咖妹并没有褒贬之意&#xff0c;只是提醒大家&#xff0c;不光淘客如此&#xff0c;其他项目亦是如此&#xff0c;别人能做成功的项目…

python sum函数numpy_如何用numba加速python?

我把写好的markdown导入进来&#xff0c;但是没想到知乎的排版如此感人。如果对知乎排版不满想要看高清清爽版&#xff0c;请移步微信公众号原文 如何用numba加速python&#xff1f;同时欢迎关注前言说道现在最流行的语言&#xff0c;就不得不提python。可是python虽然容易上手…

[ZJOI2019]麻将

Luogu5279 , LOJ3042题意&#xff1a;给出初始13张手牌&#xff0c;求理论可以和牌的最小轮数的期望&#xff0e;定义和牌为&#xff1a;4句话1对乱将&#xff0c;不能有杠&#xff1b;七对 原始题解-shadowice 写得很好的题解 首先分析期望&#xff1a;\(<--\)所有和牌的步…

采样次数不同平均值不一样_不同的真石漆装饰效果也是不一样的

外墙真石漆真的是一件很好的产品&#xff0c;具有防火性、防水性、安全且环保、粘力强、永不褪色等特点&#xff0c;无疑是人们较好的选择&#xff0c;在很早之前就已经逐渐的取代了瓷砖和其他石材在人们心中的位置。真石漆的品种不止一种&#xff0c;按照装饰效果我们可以分为…

android项目方法数超过65536的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 当项目的总方法数超过65536个&#xff0c;运行在手机上&#xff0c;指不定会报找不到哪个文件的错。 我把项目的PullRefresh框架切换为SmartRefresh框架出现了方法数超过65536。 此文只是做一下笔记&#xff0c;不多做解…

python快乐数字怎么表达_Python经典面试题:这些面试题你会了吗?

前言什么&#xff1f;你要去找工作&#xff1f;先别急着找工作&#xff0c;先把下面的python面试题先给看了吧&#xff0c;不然你就只是去面试而不是找工作。话说不打没准备的仗&#xff0c;下面这些基本的面试题都不会你怎么可能找到工作呢&#xff1f;还是先把下面的东西1、P…

【swift学习笔记】三.使用xib自定义UITableViewCell

使用xib自定义tableviewCell看一下效果图 1.自定义列 新建一个xib文件 carTblCell&#xff0c;拖放一个UITableViewCell,再拖放一个图片和一个文本框到tableviewcell上 并给我们的xib一个标识 为了学习&#xff0c;我这里的xib和后台的class是分开建的。我们再建一个cocoa touc…

命令模式(Command Pattern)

1命令模式是一个高内聚的模式。定义如下&#xff1a;将一个请求封装成一个对象&#xff0c;从而让你使用不同的请求把客户端参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;可以提供命令的撤销和恢复功能。 2.角色说明&#xff1a; ● Receive接收者角色 该角色就…

graphpad7.04多组比较p值_同是折线图为何你却这么优秀,这才是多组数据作图应该有的样子...

相信大家对Excel做折线图应该不陌生&#xff0c;在展示数据的时候&#xff0c;图表是一种最好的展示方法。但是经常会碰到一种尴尬的事情就是&#xff0c;当数据维多比较多的时候&#xff0c;做出的图表就会显得非常难看。今天我们就来学习一下&#xff0c;多组数据怎么做折线图…

linux 运行 chom,Hadoop安装-单节点/伪分布(2.7.3)

1&#xff0c;下载Hadoop目前在Ubuntu的软件库里面 没有发现Hadoop的压缩包&#xff0c;没猜错Hadoop不是可执行文件 只是一个压缩包吧&#xff01;所以我们只能自己到官网下载(http://hadoop.apache.org/releases.html)&#xff1b;在Apache社区中&#xff0c;下载软件的时候…

app之---豆果美食

1.抓包 2.代码 抓取&#xff1a; #!/usr/bin/env python # -*- coding: utf-8 -*- #author tom import requests from multiprocessing import Queue from handle_pymongo import mongo from concurrent.futures import ThreadPoolExecutorclass Douguo():def __init__(self):s…

语言坐标度分秒的换算_测量位置度说明

测量位置度说明位置度是限制被测要素的实际位置对理想位置变动量的指标。它的定位尺寸为理论正确尺寸。位置度公差在评定实际要素位置的正确性, 是依据图样上给定的理想位置。位置度包括点的位置度、线的位置度和面的位置度。[1] 点的位置度:如公差带前加S&#xffe0;&#xf…

OpenStack创建win7实例遇到的问题(尚未解决,求帮助)

原地址在这里&#xff1a;&#xff08;作者也是我&#xff0c;害羞&#xff09;http://www.aboutyun.com/forum.php?modviewthread&tid22898 小白经过两天尝试&#xff0c;用fuel部署好了OpenStack的云平台&#xff0c;接下来想在Compute节点上创建一个win7 实例&#xff…

VMware使两台windows虚拟机能够互相ping通

如果以下内容测试无效&#xff0c;可参考另一篇&#xff1a;VMware虚拟机配置内网电脑能访问 1.关闭防火墙 cmd命令行里输入&#xff1a;netsh firewall set opmode disable 2.测试如果还不能ping通&#xff0c;就把网络类型选nat类型 3.测试&#xff1a;vmware网关默认是.2 转…