LOJ 3058 「HNOI2019」白兔之舞——单位根反演+MTT
题目:https://loj.ac/problem/3058
先考虑 n=1 怎么做。令 a 表示输入的 w[1][1] 。
\( ans_t = \sum\limits_{i=0}^{L}C_{L}^{i} a^i [ k|(i-t) ] \)
\(= \frac{1}{k}\sum\limits_{i=0}^{L}C_{L}^{i} a^i \sum\limits_{j=0}^{k-1} w_{k}^{j*(i-t)} \)
\(= \frac{1}{k}\sum\limits_{j=0}^{k-1}w_{k}^{-j*t} \sum\limits_{i=0}^{L}C_{L}^{i} a^i w_{k}^{i*j} \)
\(= \frac{1}{k}\sum\limits_{j=0}^{k-1}w_{k}^{-j*t} (1+a*w_{k}^{j})^{L} \)
这样是 k2 的,就不会了……
考虑卷积。把 -j*t 拆成只和 j 有关的与只和 t 或者 t+j 、t-j 有关的。
注意到 \( j*t = C_{j+t}^{2} - C_{t}^{2} - C_{j}^{2} \) 。考虑 j*t 表示从 j 个里选一个、再从 t 个里选一个;表示成从 (j+t) 里选两个,再减去不合法的,即从 j 个里选了两个或从 t 个里选了两个。
\( ans_t = \frac{1}{k}\sum\limits_{j=0}^{k}w_{k}^{-\binom{j+t}{2}+\binom{j}{2}+\binom{t}{2}} (1+a*w_{k}^{j})^{L} \)
最后那个部分只和 j 有关。所以令 \( c_j = (1+a*w_{k}^{j})^{L} \)
\(= \frac{ w_{k}^{\binom{t}{2}} }{k}\sum\limits_{j=0}^{k-1}w_{k}^{\binom{i}{2}} c_j * w_{k}^{-\binom{j+t}{2}} \)
然后可以卷积。
如果 n>1 ,用矩阵表示 “从 x 用 i 步走到 y ”的方案!仍然要乘组合数。
也就是除了 \( c_j = ( I + A*w_{k}^{j} )^{L} [x,y] \) 之外都没变。其中 A 是输入的矩阵,[x,y] 表示取矩阵的第 x 行第 y 列的值作为 \( c_j \) 。
给矩阵乘一个数字,是给其每个位置都乘。
不开 long double 会变成 0 分。
复习 MTT 。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db long double
#define ll long long
using namespace std;
const int N=(<<)+; const db pi2=acos(-)*;
int n,k,L,x,y,mod,G,bs,len,r[N],c[N],f[N],g[N],wn[N];
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;} struct cpl{
db x,y;
cpl(db x=,db y=):x(x),y(y) {}
cpl operator+ (const cpl &b)const{return cpl(x+b.x,y+b.y);}
cpl operator- (const cpl &b)const{return cpl(x-b.x,y-b.y);}
cpl operator* (const cpl &b)const
{return cpl(x*b.x-y*b.y,x*b.y+y*b.x);}
cpl operator/ (const db &b)const{return cpl(x/b,y/b);}
}Ta[N],Tb[N],P[N],Q[N];
cpl cnj(cpl a){return cpl(a.x,-a.y);}
struct Mtr{
int a[][];
Mtr(){memset(a,,sizeof a);}
Mtr operator* (const Mtr &b)const
{
Mtr c;
for(int i=;i<n;i++)
for(int k=;k<n;k++)
for(int j=;j<n;j++)
c.a[i][j]=(c.a[i][j]+(ll)a[i][k]*b.a[k][j])%mod;
return c;
}
Mtr operator* (const int &b)const
{
Mtr c;
for(int i=;i<n;i++)
for(int j=;j<n;j++)c.a[i][j]=(ll)a[i][j]*b%mod;
return c;
}
Mtr operator+ (const Mtr &b)const
{
Mtr c;
for(int i=;i<n;i++)
for(int j=;j<n;j++)c.a[i][j]=upt(a[i][j]+b.a[i][j]);
return c;
}
}A,tA,tA2,I;
namespace get_G{
int p[],tot;
void solve()
{
int k=mod-;
for(int i=;i*i<=k;i++)
if(k%i==){ p[++tot]=(mod-)/i; while(k%i==)k/=i;}
for(int i=;;i++)
{
bool fg=;
for(int j=;j<=tot;j++)
if(pw(i,p[j])==){fg=;break;}
if(!fg){G=i;break;}
}
}
}
void fft(cpl *a,bool fx)
{
for(int i=;i<len;i++)
if(i<r[i])swap(a[i],a[r[i]]);
for(int R=;R<=len;R<<=)
{
cpl wn=cpl(cos(pi2/R),fx?-sin(pi2/R):sin(pi2/R));
for(int i=,m=R>>;i<len;i+=R)
{
cpl w=cpl(,);
for(int j=;j<m;j++,w=w*wn)
{
cpl x=a[i+j],y=w*a[i+m+j];
a[i+j]=x+y; a[i+m+j]=x-y;
}
}
}
if(!fx)return;
for(int i=;i<len;i++)a[i]=a[i]/len;
}
void MTT(int *a,int *b,int n,int m,int *c)
{
bs=sqrt(mod); cpl ta,tb,tc,td;
for(len=;len<=n+m;len<<=);
for(int i=,j=len>>;i<len;i++)
r[i]=(r[i>>]>>)+((i&)?j:);
for(int i=;i<=n;i++) P[i]=cpl(a[i]/bs,a[i]%bs);
for(int i=;i<=m;i++) Q[i]=cpl(b[i]/bs,b[i]%bs);
fft(P,); fft(Q,);
P[len]=P[]; Q[len]=Q[];
for(int i=;i<len;i++)
{
ta=(P[i]+cnj(P[len-i]))*cpl(0.5,);
tb=(P[i]-cnj(P[len-i]))*cpl(,-0.5);
tc=(Q[i]+cnj(Q[len-i]))*cpl(0.5,);
td=(Q[i]-cnj(Q[len-i]))*cpl(,-0.5);
Ta[i]=ta*tc+ta*td*cpl(,);
Tb[i]=tb*tc+tb*td*cpl(,);
}
fft(Ta,); fft(Tb,);
for(int i=,lm=n+m,bs2=bs*bs;i<=lm;i++)
{
int a2=(ll)(Ta[i].x+0.5)%mod;//%mod
int b2=(ll)(Ta[i].y+0.5)%mod;
int c2=(ll)(Tb[i].x+0.5)%mod;
int d2=(ll)(Tb[i].y+0.5)%mod;
c[i]=((ll)a2*bs2+(ll)(b2+c2)*bs+d2)%mod;
}
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&k,&L,&x,&y,&mod);
get_G::solve(); x--; y--;
for(int i=;i<n;i++)
for(int j=;j<n;j++)scanf("%d",&A.a[i][j]);
wn[]=; wn[]=pw(G,(mod-)/k);
for(int i=;i<=k;i++)wn[i]=(ll)wn[i-]*wn[]%mod;//<=k
for(int i=;i<n;i++)I.a[i][i]=;//
for(int i=;i<k;i++)
{
tA=A*wn[i]+I; tA2=I; int tp=L;//tp=L not i!!!!!
while(tp)
{ if(tp&)tA2=tA2*tA; tA=tA*tA; tp>>=;}
c[i]=tA2.a[x][y];
}
for(int i=;i<k;i++)
f[k--i]=(ll)wn[(ll)i*(i-)/%k]*c[i]%mod;
for(int i=,lm=*(k-);i<=lm;i++)
g[i]=wn[k-(ll)i*(i-)/%k];
MTT(f,g,k-,*(k-),f); int inv=pw(k,mod-);
for(int i=;i<k;i++)
{
int ans=(ll)wn[(ll)i*(i-)/%k]*inv%mod;
ans=(ll)ans*f[k-+i]%mod; printf("%d\n",ans);
}
return ;
}
LOJ 3058 「HNOI2019」白兔之舞——单位根反演+MTT的更多相关文章
- Loj 3058. 「HNOI2019」白兔之舞
Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...
- LOJ3058. 「HNOI2019」白兔之舞 [DP,MTT]
LOJ 前置知识:任意长度NTT 普通NTT只能做\(2^k\)的循环卷积,尝试扩展成长度为\(n\)的循环卷积,保证模意义下\(\omega_n\)存在. 不管怎样还是要算点值.推式子: \[ \b ...
- 「loj3058」「hnoi2019」白兔之舞
题意 有一个\((L+1)*n\) 的网格图,初始时白兔在\((0,X)\) , 每次可以向横坐标递增,纵坐标随意的位置移动,两个位置之间的路径条数只取决于纵坐标,用\(w(i,j)\) 表示,如果要 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
- Loj #3057. 「HNOI2019」校园旅行
Loj #3057. 「HNOI2019」校园旅行 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你 ...
- LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分
题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...
- LOJ 3057 「HNOI2019」校园旅行——BFS+图等价转化
题目:https://loj.ac/problem/3057 想令 b[ i ][ j ] 表示两点是否可行,从可行的点对扩展.但不知道顺序,所以写了卡时间做数次 m2 迭代的算法,就是每次遍历所有不 ...
随机推荐
- Warning: Cannot modify header information原因及解决方案
相信大多数人在写PHP代码的时候,都遇到过类似"Warning: Cannot send session cookie – headers already sent…“或者”Cannot a ...
- 所有硬币组合问题——动态规划hdu2069
Problem Description Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cen ...
- 软件体系结构-分层、代理、MVC、管道与过滤器
什么是软件架构? 程序或计算系统的软件体系结构是系统的一个或多个结构,包括软件元素.这些元素的外部可见属性以及它们之间的关系. ——Software Engineering Institute(SEI ...
- [6期]Webshell提权服务器登录
这一期内容较少,分享一点资料给大家吧:https://www.bilibili.com/video/av27708518/?spm_id_from=333.788.b_636f6d6d656e74.9 ...
- (转)https://wiki.debian.org/iwlwifi debian7下wifi intel 5100agn
https://wiki.debian.org/iwlwifi Debian 7 "Wheezy" Add a "non-free" component to ...
- vuejs基础-事件修饰符
事件修饰符: .stop 阻止冒泡 .prevent 阻止默认事件 .capture 添加事件侦听器时使用事件捕获模式 .self 只当事件在该元素本身(比如不是子元素)触发时触发回调 .once 事 ...
- [Linux] 020 RPM 包的命名原则与其依赖性
1. RPM 包命名原则 例如:httpd-2.2.15-15.e16.centos.1.i686.rpm 字符 释义 httpd 软件包名 2.2.15 软件版本 15 软件发布的次数 e16.ce ...
- IDEA 中常用插件
怎么找到安装插件位置 Mybatis plugin 可以在mapper接口中和mapper的xml文件中来回跳转,就想接口跳到实现类那样简单. Lombok plugin 开发神器,可以简化你的实体类 ...
- Mybatis-技术专区-Mapper接口以及Example的实例函数及详解
一.mapper接口中的方法解析 mapper接口中的函数及方法 int countByExample(UserExample example) thorws SQLException 按条件 ...
- vue2.0在IE11无法打开的解决办法
npm 安装bebel-polyfill npm install --save-dev babel-polyfill 在webpack.base.conf.js文件中将 module.exports ...