博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2019]白兔之舞(MTT+单位根反演)
阅读量:5267 次
发布时间:2019-06-14

本文共 3280 字,大约阅读时间需要 10 分钟。

\[ 注:W是一个矩阵,表示题中w[i][j],下列式子中的W做加减法时表示W_{xy}\\ ans_t=\Sigma_{i\ mod\ k=t}^L{L \choose i}W^i\\ =\Sigma_{i=0}^L[k|(i-t)]{L \choose i}W^i\\ =\Sigma_{i=0}^L\frac1k\Sigma_{j=0}^{k-1}(\omega_k^{i-t})^j{L \choose i}W^i\\ =\Sigma_i^L\frac1k\Sigma_{j=0}^{k-1}\omega_k^{ij-tj}{L \choose i}W^i\\ =\frac1k\Sigma_{j=0}^{k-1}\omega_k^{
{t \choose 2}+{j \choose 2}-{t+j \choose 2}}\Sigma_{i=0}^L\omega_k^{ij}{L \choose i}W^i\\ 设C(j)=\Sigma_{i=0}^L\omega_k^{ij}{L \choose i}W^i\\ 把它变成二项式的形式:\\ A(j)=\Sigma_{i=0}^L{L \choose i}(W\omega_k^j)^i*1^{L-i}\\ \therefore A(j)=(W\omega_k^j+1)^L\\ \therefore ans_t=\frac{\omega_k^{t \choose 2}}k\Sigma_{j=0}^{k-1}\omega_k^{j \choose 2}A(j)\omega_k^{-{t+j \choose 2}}\\ 这好像是还不是卷积,但是我们可以把它变成卷积\\ 令f(x)=\omega_k^{x \choose 2}\\ 令g(x)=A(x)\omega_k^{-{t+x \choose 2}}\\ 那么按照常规操作,将f倍增,再将g翻转.\\ \therefore ans_t=\frac{\omega_k^{t \choose 2}}k(f*g)(k+t)\\ 然后卷积用MTT算,就没了. \]

#pragma GCC optimize(3)#include
#define N (65536*4)using namespace std;const double pi=acos(-1);int n,k,l,x,y,p;struct Matrix{ int a[3][3]; void format(){ memset(a,0,sizeof(a)); } friend Matrix operator + (const Matrix &a,const Matrix &b){ Matrix re; for(int i=0;i<3;i++) for(int j=0;j<3;j++){ re.a[i][j]=(a.a[i][j]+b.a[i][j])%p; } return re; } friend Matrix operator * (const Matrix &a,const Matrix &b){ Matrix re; re.format(); for(int i=0;i<3;i++) for(int j=0;j<3;j++) for(int k=0;k<3;k++){ re.a[i][j]=(re.a[i][j]+1ll*a.a[i][k]*b.a[k][j])%p; } return re; } friend Matrix operator * (const int &a,const Matrix &b){ Matrix re; for(int i=0;i<3;i++) for(int j=0;j<3;j++){ re.a[i][j]=(1ll*a*b.a[i][j])%p; } return re; } friend Matrix operator * (const Matrix &a,const int &b){return b*a;}}I,W;Matrix Pow(Matrix x,int y){ Matrix re=I; while(y){ if(y&1)re=re*x; y>>=1; x=x*x; } return re;}struct Complex{double x,y;};Complex operator + (Complex a,Complex b){return (Complex){a.x+b.x,a.y+b.y};}Complex operator - (Complex a,Complex b){return (Complex){a.x-b.x,a.y-b.y};}Complex operator * (Complex a,Complex b){return (Complex){a.x*b.x-a.y*b.y,a.y*b.x+a.x*b.y};}Complex a[N],b[N],c[N];int Pow(int x,int y){ int re=1; while(y){ if(y&1)re=(1ll*re*x)%p; y>>=1; x=(1ll*x*x)%p; } return re;}int rev[N];int pre(int n,int m){ int high=0,cnt=1;; while(cnt
<<=1,high++; for(int i=0;i
>1]>>1)|((i&1)<<(high-1)); return cnt;}int root(int num){ int div[128],sum=0; int phi=num-1; for(int i=2;i<=phi;i++){ if(phi%i==0){ div[++sum]=i; while(phi%i==0)phi/=i; } } if(phi!=1)div[++sum]=phi; int re=2; while(1){ int flag=1; for(int i=1;i<=sum;i++){ int pw=Pow(re,(num-1)/div[i]); if(pw==1){flag=0;break;} } if(flag)return re; re++; }}Complex w[N];void fft(int lim,Complex *buf,int dft=1){ for(int i=0;i
>15,B1[i].x=A[i]&32767; for(int i=0;i
>15,B2[i].x=B[i]&32767; for(int i=0;i

转载于:https://www.cnblogs.com/nlKOG/p/10754952.html

你可能感兴趣的文章
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>
让IE浏览器支持CSS3圆角属性的方法
查看>>
巡风源码阅读与分析---nascan.py
查看>>
LiveBinding应用 dataBind 数据绑定
查看>>
Linux重定向: > 和 &> 区别
查看>>
nginx修改内核参数
查看>>
C 筛选法找素数
查看>>
TCP为什么需要3次握手与4次挥手(转载)
查看>>
IOC容器
查看>>
Windows 2003全面优化
查看>>
URAL 1002 Phone Numbers(KMP+最短路orDP)
查看>>
web_day4_css_宽度
查看>>
electron入门心得
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>