Description

https://loj.ac/problem/3058

Solution

首先答案长这样子:anst=∑i=0L[k∣(i−t)]Ai(Li)ans_t=\sum\limits_{i=0}^L[k|(i-t)]A^i\binom{L}{i}anst​=i=0∑L​[k∣(i−t)]Ai(iL​),AAA是读入的矩阵,最后取(x,y)(x,y)(x,y)的值
套上单位根反演就是:∑i=0LAx,yi(Li)1k∑j=0k−1ωk(i−t)j\sum\limits_{i=0}^LA^i_{x,y}\binom{L}{i}\dfrac{1}{k}\sum\limits_{j=0}^{k-1}\omega_k^{(i-t)j}i=0∑L​Ax,yi​(iL​)k1​j=0∑k−1​ωk(i−t)j​,其中ωk=gp−1k\omega_k=g^{\frac{p-1}{k}}ωk​=gkp−1​,ggg是原根。
交换主体再化简:1k∑j=0k−1ωk−tj∑i=0L(Li)ωkijAx,yi=1k∑j=0k−1ωk−tj(ωkjA+1)L\dfrac{1}{k}\sum\limits_{j=0}^{k-1}\omega_k^{-tj}\sum\limits_{i=0}^L\binom{L}{i}\omega_k^{ij}A_{x,y}^i=\dfrac{1}{k}\sum\limits_{j=0}^{k-1}\omega_k^{-tj}(\omega_{k}^jA+1)^Lk1​j=0∑k−1​ωk−tj​i=0∑L​(iL​)ωkij​Ax,yi​=k1​j=0∑k−1​ωk−tj​(ωkj​A+1)L
然后把−tj-tj−tj拆开:−tj=(t2)+(j2)−(t+j2)-tj=\binom{t}{2}+\binom{j}{2}-\binom{t+j}{2}−tj=(2t​)+(2j​)−(2t+j​)。
最后式子就是:anst=1kωk(t2)∑j=0k−1ωk(j2)(ωkjA+1)Lωk(t+j2)ans_t=\dfrac{1}{k}\omega_k^{\binom{t}{2}}\sum\limits_{j=0}^{k-1}\omega_k^{\binom{j}{2}}(\omega_k^jA+1)^L\omega_k^{\binom{t+j}{2}}anst​=k1​ωk(2t​)​j=0∑k−1​ωk(2j​)​(ωkj​A+1)Lωk(2t+j​)​
把ωk(t+j2)\omega_k^{\binom{t+j}{2}}ωk(2t+j​)​和anstans_tanst​翻转一下就是一个卷积形式了。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,j,k) for(int i=j;i<=k;++i)
#define fd(i,j,k) for(int i=j;i>=k;--i)
using namespace std;
typedef long long ll;
const int N=1e5+10,M=3e5+10,qmo=31622;
int n,P;
int w[N];
int qpow(int x,int y){int s=1;for(;y;y>>=1,x=(ll)x*x%P) if(y&1) s=(ll)s*x%P;return s;
}
void inc(int &x,int y){x=x+y>=P?x+y-P:x+y;
}
struct mat{int a[4][4];void clear(){memset(a,0,sizeof(a));fo(i,1,n) a[i][i]=1;}friend mat operator *(mat x,mat y){mat z;memset(z.a,0,sizeof(z.a));//z.a[1] z.a[2] z.a[3]fo(i,1,n)fo(j,1,n){ll t=0;fo(k,1,n) t+=(ll)x.a[i][k]*y.a[k][j];z.a[i][j]=t%P;}return z;}void mul(int x){fo(i,1,n)fo(j,1,n) a[i][j]=(ll)a[i][j]*x%P;}
}A,S,z;
void matpow(int y){S.clear();for(;y;y>>=1,A=A*A)if(y&1) S=S*A;
}
int pr[50];
int getrt(){int x=P-1;for(int i=2;i*i<=x;++i) if(x%i==0){pr[++pr[0]]=i;for(;x%i==0;x/=i);}fo(i,2,P-1){bool flag=1;fo(j,1,pr[0]) if(qpow(i,(P-1)/pr[j])==1){flag=0;break;}if(flag) return i;}
}
struct node{double x,y;node(double _x=0,double _y=0) {x=_x,y=_y;}
}a[M],b[M],c1[M],c2[M],c3[M],W[M];
const double pi=acos(-1);
node operator+(node x,node y) {return node(x.x+y.x,x.y+y.y);}
node operator-(node x,node y) {return node(x.x-y.x,x.y-y.y);}
node operator*(node x,node y) {return node(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);}
node conj(node a) {return node(a.x,-a.y);}
int rev[M],g[M];
void DFT(node *a,int fn,int sig) {fo(i,0,fn-1) if(i<rev[i]) swap(a[i],a[rev[i]]);for(int m=2;m<=fn;m<<=1){int half=m/2,t=fn/m;fo(i,0,half-1){node w=sig>0?W[t*i]:W[fn-t*i];for(int j=i;j<fn;j+=m){node u=a[j],v=w*a[j+half];a[j]=u+v,a[j+half]=u-v;}}}if(sig==-1) fo(i,0,fn-1) a[i].x/=fn;
}
void mul(int *A,int *B,int nl,int nr){int fn,cnt=0;for(fn=1;fn<=nl+nr;fn<<=1) ++cnt;fo(i,0,fn) W[i]=node(cos(2*i*pi/fn),sin(2*i*pi/fn));fo(i,1,fn-1) rev[i]=rev[i>>1]>>1|(i&1)<<(cnt-1);fo(i,0,nl) a[i]=node(A[i]/qmo,A[i]%qmo);fo(i,nl+1,fn-1) a[i]=node(0,0);fo(i,0,nr) b[i]=node(B[i]/qmo,B[i]%qmo);fo(i,nr+1,fn-1) b[i]=node(0,0);DFT(a,fn,1),DFT(b,fn,1);fo(i,0,fn-1){int j=(fn-i)&(fn-1);node p1,p2,q1,q2;p1=(a[i]+conj(a[j]))*node(0.5,0);p2=(a[i]-conj(a[j]))*node(0,-0.5);q1=(b[i]+conj(b[j]))*node(0.5,0);q2=(b[i]-conj(b[j]))*node(0,-0.5);c1[i]=p1*q1,c2[i]=p1*q2+p2*q1,c3[i]=p2*q2;}DFT(c1,fn,-1),DFT(c2,fn,-1),DFT(c3,fn,-1);fo(i,0,fn-1){g[i]=((ll)(c1[i].x+0.5)*qmo%P*qmo%P+(ll)(c2[i].x+0.5)*qmo%P+(ll)(c3[i].x+0.5))%P;}fo(i,0,nl+nr) A[i]=g[i];fo(i,nl+nr+1,fn-1) A[i]=0;
}
int k;
int C2(int x){return (ll)x*(x-1)/2%k;
}
int c[M],d[M];
int main()
{freopen("dance.in","r",stdin);freopen("dance.out","w",stdout);int L,x,y;scanf("%d %d %d %d %d %d",&n,&k,&L,&x,&y,&P);int nk=qpow(k,P-2);w[0]=1,w[1]=qpow(getrt(),(P-1)/k);fo(i,2,k-1) w[i]=(ll)w[i-1]*w[1]%P;fo(i,1,n)fo(j,1,n) scanf("%d",&z.a[i][j]);fo(i,0,k-1){A=z;A.mul(w[i]);fo(j,1,n) inc(A.a[j][j],1);matpow(L);c[i]=(ll)S.a[x][y]*w[C2(i)]%P;}fo(i,0,2*k-2) d[i]=qpow(w[C2(i)],P-2);/*fo(i,0,k-1){int tmp=0;fo(j,0,k-1) inc(tmp,(ll)c[j]*d[i+j]%P);tmp=(ll)tmp*nk%P*w[C2(i)]%P;printf("%d\n",tmp);}*/reverse(d,d+2*k-1);mul(c,d,k-1,2*k-2);reverse(c,c+2*k-1);fo(i,0,k-1){c[i]=(ll)c[i]*nk%P*w[C2(i)]%P;printf("%d\n",c[i]);}
}

【LOJ3058】【HNOI2019】白兔之舞相关推荐

  1. #loj 3058 [HNOI2019] 白兔之舞

    单位根反演思博题 模数是乱给的记得整个任意模数ntt k为p-1的约数意味着一定存在k次单位根,设g是p的原根则\(w_{k}^{1}=g^{\frac{k-1}{p}}\) 既然k次单位根存在自然考 ...

  2. 【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\le ...

  3. 【HNOI2019】部分题简要题解

    题意懒得写了 LOJ Day 1 T1 鱼 个人做法比较猎奇,如果有哪位大佬会证明能分享一下的话感激不尽. 题解:枚举鱼尾和鱼身的交点D,将所有其他点按照到D的距离排序,距离相同的分一组. 感性的理解 ...

  4. Outsider(HNOI2019)

    这不是一篇退役记,因为NOIP2018之后就写完了. Day-1 清明时节雨纷纷. 最后的时光,应该是怎么样的呢? 是像水滴一样,悄无声息地从指缝中溜走 还是如火焰一般,燃烧着最后的留恋? 晚上一直在 ...

  5. GOOD BYE OI

    大米饼正式退役了,OI给我带来很多东西 我会的数学知识基本都在下面了 博客园的评论区问题如果我看到了应该是会尽力回答的... 这也是我作为一个OIer最后一次讲课的讲稿 20190731 多项式乘法 ...

  6. 暴风前员工替冯鑫惋惜,是公司的老白兔员工害了他

    眼看他起高楼,眼看他楼塌了,这句话用来形容暴风冯鑫再恰当不过.曾经市值高达400亿,如今缩水不足20亿,这其中到底发生了什么?有暴风前员工在职场社区揭露了鲜为人知的一幕. 该员工直言是公司的老白兔害了 ...

  7. Loj #3055. 「HNOI2019」JOJO

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

  8. python【蓝桥杯vip练习题库】BASIC-21Sine之舞(递归 递推)

    试题 基础练习 Sine之舞 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和 ...

  9. 基础练习 Sine之舞 (递推)

    问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力 ...

  10. java 蓝桥杯 基础练习 Sine之舞

    问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力 ...

最新文章

  1. 如何使您的Kotlin Android动画可访问
  2. 分页打印 PAGE-BREAK-AFTER: always
  3. Nginx之rewrite:域名与二级目录之间的跳转
  4. 自学计算机科学CS总结-by 要有光LTBL
  5. HoloLens开发手记-配置开发环境 Install the tools
  6. 无代码绘制基因表达箱线图
  7. 你H第一次做的视频,在B站播放量过万了~
  8. 信息学奥赛一本通 1925:【03NOIP普及组】麦森数 | OpenJudge NOI 4.4 1708:麦森数 | 洛谷 P1045 [NOIP2003 普及组] 麦森数
  9. CCIE基础知识之EIGRP 二
  10. Python遍历破解FTP密码,并上传webshell
  11. JAVA wait(), notify(),sleep详解
  12. Java练习 SDUT-1294_选票统计
  13. 三菱凌云3故障代码_三菱故障代码一览表
  14. Excel:INDIRECT函数
  15. 华硕台式计算机光盘怎么启动不了,华硕台式机U盘启动不了怎么回事
  16. word2007如何批量删除文本框
  17. 计算机如何认硬盘,电脑怎样识别大容量的硬盘?
  18. 【web前端面试题整理07】我不理解表现与数据分离。。。
  19. handsome主题添加服务器信息,handsome主题部分常用markdown语法
  20. length与length()的区别

热门文章

  1. mysql输入20万数据_mysql生成20万条数据(连表插入)
  2. Word中插入参考文献 自动管理
  3. 做项目管理需要哪些技能呢?
  4. 运行navicat报出Missing required library libmysql_d.dll,126问题
  5. 个人网盘搭建过程--资料来自腾讯云实验室
  6. 基于DSP的主动降噪开发之三(CCS软件学习)
  7. 智能指针之atuo_ptr源码剖析
  8. IOS点,分辨率,尺寸,机型
  9. vs2013编译ffmpeg之三十一 vidstab
  10. python excel 设置行高与列宽