题意

有一个\((L+1)*n\) 的网格图,初始时白兔在\((0,X)\) , 每次可以向横坐标递增,纵坐标随意的位置移动,两个位置之间的路径条数只取决于纵坐标,用\(w(i,j)\) 表示,如果要求白兔停下的点纵坐标为\(Y\) 依次输出移动的步数对\(k\) 取模为 $0 - k -1 $的方案数;

\(p\)为质数且$10^8 \lt p \lt 2^{30} , 1 \le n \le 3 , 1 \le x , y \le n , 0 \le w(i,j) \lt p , 1 \le k \le 65536 , \le L \le 10^8 $,

满足\(k\)是\(p-1\)的一个约数;

题解

  • 即求:$ f_r = \sum_{i=0}{L}(L_i) (A^i)_{X,Y} [ i \ mod \ k = r] $

  • $Part \ 1 $

  • 单位根反演:

\[根据求和引理:\\
\frac{1}{n} \sum_{j=0}^{n-1}\omega_n^{ij} =
\begin{cases}
1 \ \ \ i \ mod \ n = 0 \\ 0 \ \ \ i \ mod \ n \neq 0 \\
\end{cases}
\\这个等比数列求和即可证明;
\\用这个来换掉式子中的取模:\\
\begin{align}
&=\sum_{i=0}^{L}(^L_i)A^i_{x,y}\frac{1}{k}\sum_{j=0}^{k-1} \omega_k^{(i-r)j}\\
&=\frac{1}{k}\sum_{i=0}^{k-1}\omega_k^{-ir}\sum_{j=0}^{L}(^L_j)(A^j)_{x,y}\times \omega^{ij}_k\\
&=\frac{1}{k}\sum_{i=0}^{k-1}\omega_k^{-ir}(w^i_kA+I)^L_{x,y}\\
&=\frac{1}{k}\sum_{i=0}^{k-1}a_i\omega_k^{-ir}
\end{align}\]

  • 当\(k = 2^x\)次方时,可以用裸的\(fft\)求出答案;

  • \(Part 2\)

  • 但是没有必要,当 \(k\) 为任意数,由于\(k \ | \ mod - 1\),所以\(\omega_k\)可以用原根的\((mod-1)/k\)来代替;

  • 同时注意到: $ ab = (^{a+b}_2) - (^a_2) - (^b_2) $

  • $ f_r = \frac{1}{k}w_k{(r_2)} \sum_{i=0}^{k-1}a_i \omega _k{(i_2)} \times \omega_k{-({i+r}_2)} $

  • 直接reverse+mtt即可;

    1. //注意mtt的精度;
    2. #include<bits/stdc++.h>
    3. #define ll long long
    4. #define ld double
    5. using namespace std;
    6. const int N=1<<20;
    7. int n,k,l,X,Y,mod,a[N],b[N],A[N],B[N],C[N],fac[N],tot;
    8. char gc(){
    9. static char*p1,*p2,s[1000000];
    10. if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
    11. return(p1==p2)?EOF:*p1++;
    12. }
    13. int rd(){
    14. int x=0;char c=gc();
    15. while(c<'0'||c>'9')c=gc();
    16. while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
    17. return x;
    18. }
    19. int pw(int x,int y){
    20. int re=1;
    21. while(y){
    22. if(y&1)re=(ll)re*x%mod;
    23. y>>=1;x=(ll)x*x%mod;
    24. }
    25. return re;
    26. }
    27. int find_rt(int p){
    28. int tmp=p-1;
    29. for(int i=2;i*i<=tmp;++i)if(tmp%i==0){
    30. fac[++tot]=i;
    31. while(tmp%i==0)tmp/=i;
    32. }
    33. if(tmp!=1)fac[++tot]=tmp;
    34. for(int i=2;;++i){
    35. int fg=0;
    36. for(int j=1;j<=tot;++j)if(pw(i,(p-1)/fac[j])==1){fg=1;break;}
    37. if(!fg)return i;
    38. }
    39. return 0;
    40. }
    41. struct Mat{
    42. int a[3][3];
    43. void init(){
    44. memset(a,0,sizeof(a));
    45. for(int i=0;i<n;++i)a[i][i]=1;
    46. }
    47. Mat operator *(const int&A){
    48. Mat re;
    49. for(int i=0;i<n;++i)
    50. for(int j=0;j<n;++j)re.a[i][j]=(ll)a[i][j]*A%mod;
    51. return re;
    52. }
    53. Mat operator *(const Mat&A){
    54. Mat re;
    55. for(int i=0;i<n;++i)
    56. for(int j=0;j<n;++j){
    57. re.a[i][j]=0;
    58. for(int k=0;k<n;++k){
    59. re.a[i][j]+=(ll)a[i][k]*A.a[k][j]%mod;
    60. if(re.a[i][j]>=mod)re.a[i][j]-=mod;
    61. }
    62. }
    63. return re;
    64. }
    65. Mat operator +(const Mat&A){
    66. Mat re;
    67. for(int i=0;i<n;++i)
    68. for(int j=0;j<n;++j){
    69. re.a[i][j]=a[i][j]+A.a[i][j];
    70. if(re.a[i][j]>=mod)re.a[i][j]-=mod;
    71. }
    72. return re;
    73. }
    74. }mp,I;
    75. int pw(Mat x,int y){
    76. Mat re;re.init();
    77. while(y){
    78. if(y&1)re=re*x;
    79. y>>=1;x=x*x;
    80. }
    81. return re.a[X][Y];
    82. }
    83. struct com{
    84. ld x,y;
    85. com(ld _x=0,ld _y=0):x(_x),y(_y){};
    86. com operator +(const com&A)const{return com(x+A.x,y+A.y);}
    87. com operator -(const com&A)const{return com(x-A.x,y-A.y);}
    88. com operator *(const com&A)const{return com(x*A.x-y*A.y,x*A.y+y*A.x);}
    89. com operator /(const ld&A)const{return com(x/A,y/A);}
    90. com operator !()const{return com(x,-y);}
    91. };
    92. namespace poly{
    93. const ld pi=acos(-1);
    94. int L,len,rev[N];com Wn[N];
    95. void init(int l){
    96. for(L=0,len=1;len<=l<<1;len<<=1,++L);
    97. for(int i=0;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
    98. //Wn[0]=com(1,0);Wn[1]=com(cos(pi/len),sin(pi/len));
    99. //for(int i=2;i<len;++i)Wn[i]=Wn[i-1]*Wn[1];
    100. for(int i=0;i<len;++i)Wn[i]=com(cos(pi*i/len),sin(pi*i/len));
    101. }
    102. void fft(com*A,int f){
    103. for(int i=0;i<len;++i)if(i<rev[i])swap(A[i],A[rev[i]]);
    104. for(int i=1;i<len;i<<=1){
    105. for(int j=0;j<len;j+=i<<1){
    106. for(int k=0;k<i;++k){
    107. com w=~f?Wn[len/i*k]:!Wn[len/i*k];//
    108. com x=A[j+k],y=w*A[j+k+i];
    109. A[j+k]=x+y;A[j+k+i]=x-y;
    110. }
    111. }
    112. }
    113. if(!~f)for(int i=0;i<len;++i)A[i]=A[i]/len;
    114. }
    115. void mtt(int*A,int*B,int*C){
    116. static com t1[N],t2[N],t3[N],t4[N];
    117. int all=(1<<15)-1;
    118. for(int i=0;i<len;++i){
    119. t1[i]=com(A[i]>>15,A[i]&all);
    120. t2[i]=com(B[i]>>15,B[i]&all);
    121. }
    122. fft(t1,1);fft(t2,1);
    123. for(int i=0;i<len;++i){
    124. com x1=t1[i],y1=!t1[len-i&len-1];
    125. com x2=t2[i],y2=!t2[len-i&len-1];
    126. t3[i] = (x1+y1)*x2*com(0.5,0);//(x1+y1)/2(x2+y2)/2 + (x1+y1)/2(x2-y2)/2i * i ;
    127. t4[i] = (x1-y1)*x2*com(0,-0.5);//(x1-y1)/2i(x2+y2)/2 + (x1-y1)/2i(x2-y2)/2i * i ;
    128. }
    129. fft(t3,-1);fft(t4,-1);
    130. for(int i=0;i<len;++i){
    131. C[i] = (((ll)(t3[i].x+0.5)%mod <<30)%mod +
    132. ((ll)(t3[i].y+0.5)%mod <<15)%mod +
    133. ((ll)(t4[i].x+0.5)%mod <<15)%mod +
    134. (ll)(t4[i].y+0.5)%mod ) %mod ;
    135. }
    136. }
    137. }
    138. int main(){
    139. // freopen("dance.in","r",stdin);
    140. // freopen("dance.out","w",stdout);
    141. n=rd();k=rd();l=rd();X=rd()-1;Y=rd()-1;mod=rd();I.init();
    142. for(int i=0;i<n;++i)for(int j=0;j<n;++j)mp.a[i][j]=rd();
    143. int G=find_rt(mod),wk=pw(G,(mod-1)/k);
    144. for(int i=0,w=1;i<k;++i,w=(ll)w*wk%mod)a[i]=pw((mp*w+I),l);
    145. for(int i=0;i<=k-1<<1;++i)b[i]=pw(wk,(ll)i*(i-1)/2%(mod-1));
    146. for(int i=0;i<k;++i)A[i]=(ll)a[i]*b[i]%mod;
    147. for(int i=0;i<=k-1<<1;++i)B[i]=pw(b[(k-1<<1)-i],mod-2);
    148. poly::init(k-1<<1);
    149. poly::mtt(A,B,C);
    150. int iv=pw(k,mod-2);
    151. for(int i=0;i<k;++i){
    152. int now = (ll)iv*b[i]%mod*C[(k-1<<1)-i]%mod;
    153. printf("%d\n",now);
    154. }
    155. return 0;
    156. }

「loj3058」「hnoi2019」白兔之舞的更多相关文章

  1. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

  2. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  3. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  4. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  5. Loj #3057. 「HNOI2019」校园旅行

    Loj #3057. 「HNOI2019」校园旅行 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你 ...

  6. [LOJ3054] 「HNOI2019」鱼

    [LOJ3054] 「HNOI2019」鱼 链接 链接 题解 首先想 \(O(n^3)\) 的暴力,不难发现枚举 \(A\) 和 \(D\) 后, \((B,C)\) 和 \((E,F)\) 两组点互 ...

  7. 众安「尊享e生」果真牛的不可一世么?

    近日,具有互联网基因的.亏损大户(成立三年基本没盈利,今年二季度末亏损近4亿,你能指望它多厉害?).财产险公司—众安推出“尊享e生”中高端医疗保险(财险公司经营中高端医疗真的很厉害?真的是中高端医疗险 ...

  8. XCActionBar 「Xcode 中的 Alfred」

    下载地址:https://github.com/pdcgomes/XCActionBar 基本命令: (1)「command+shift+8」或者双击「command」键可以打开「动作输入框窗口」 ( ...

  9. Git 执行 「fork 出来的仓库」和「最新版本的原仓库」内容同步更新

    当我们在 GitHub 上 fork 出一个仓库后,如果原仓库更新了,此时怎样才能保证我们 fork 出来的仓库和原仓库内容一致呢?我们一般关注的是仓库的 master(主干分支)的内容,通过以下步骤 ...

  10. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

随机推荐

  1. IOS 上架到App Store被拒的常见问题总结

    Guideline 2.3.3 - Performance - Accurate Metadata 2017年11月16日 上午12:52 发件人 Apple 2. 3 Performance: Ac ...

  2. VMware workstation运维实践系列博客导航

    第一章:VMware workstation虚拟化1.1 VMware workstation计算网络存储介绍1.2 VMware workstation其他功能特性介绍1.3 VMware work ...

  3. Redis Cluster集群知识学习总结

    Redis集群解决方案有两个: 1)  Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...

  4. og标签对SEO的作用及用法

    meta property=og标签对SEO的作用及用法,如果你仔细观察会发现本站点<head>代码中有一段:"property="og:image"这段代码 ...

  5. 如何用chrome查看post get及返回的数据

    chrome浏览器按下F12打开开发者工具 点击Network,找到过滤器 筛选XHR,Method那一列会显示POST GET:

  6. D. Boxes Packing

    链接 [http://codeforces.com/contest/1066/problem/D] 题意 题目大意 n个物品m个篮子每个篮子容量为k 每个物品重量为a[i] 问能装多少物品 这个人是强 ...

  7. windows上tomcat8的安装及配置

    提示:在安装tomcat之前,确定安装好jdk. 一.下载tomcat8 http://tomcat.apache.org/download-80.cgi 点击这个网址 根据自己电脑的才做系统版本安装 ...

  8. Linux内核分析期中总结

    目录: “Linux内核分析”实验一报告 “Linux内核分析”实验二报告 “Linux内核分析”实验三报告 Linux实验四报告 “Linux内核分析”第五周报告 "Linux内核分析&q ...

  9. Linux内核分析——字符集总结与分析

      一.  设置修改系统.应用默认字符集 1. 查看虚拟机的字符集: 由此可见,该虚拟机的字符集为zh_CN.UTF-8. 2. 查看服务器支持的编码方式 3. 修改字符集类型 上图可见,LANG字符 ...

  10. 福州大学软件工程1816 | W班 作业成绩排名汇总

    评分链接 第一次作业--准备篇 第二次作业--个人项目实战 第三次作业--原型设计(结对第一次) 第四次作业--团队展示(团队) 第五次作业--项目选题报告(团队) 第六次作业--结对第2次作业--W ...