loj548 「LibreOJ β Round #7」某少女附中的体育课
这道题好神啊!!!
发现这题就是定义了一种新的卷积,然后做k+1次卷积。
这里我们就考虑构造一个变换T,使得$T(a) \cdot T(b) =T(a∘b)$,这里是让向量右乘这个转移矩阵。
于是我们可以得到
$$\sum_{j=0}^{m-1}{T_{j,i} \sum{[k ∘ l =j] a_{k} b_{l}} } = (\sum_{j=0}^{m-1}{T_{j,i}a_{j}}) \cdot (\sum_{j=0}^{m-1}{T_{j,i}b_{j}})$$
$$\sum{T_{k∘l,i}{a_{k}b_{l}}}= \sum{T_{k,i}T_{l,i}a_{k} b_{l}}$$
设x为T的某一列向量,这个变换满足的条件就是$x_{j}x_{k}=x_{j∘k}$
又因为循环律,设$c_{i}$为$i$的周期长度,我们发现$x_{i^{c_{i}}}=x_{i}^{c_{i}}=x_{i}$,所以$x_{i}=w_{c_{i}}^{k} or 0$。
之后我们发现合法的情况只有n种,考虑暴搜变换然后加上上面那个减枝就可以了。
然后我们就得到了我们要求的变换,然后就像fwt一样每一维依次进行变换就可以了。
正解依旧没有看懂,我的理解就是按照$x^{0}$分成若干个等价类,对于每个等价类内dft构造出一个其中若干个变换,然后在将每个小变换扩展全部,但是具体的怎么dft以及如何扩展的我还不是特别明白,所以先挖个大坑吧。其实我觉得这种需要构造变换的题暴搜都是可以碾压正解的,因为暴搜加减枝的复杂度真的很优秀。
最后,LCA太神啦!
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define mod 232792561
#define N 500500
#define M 25
using namespace std;
int rt=,n,m,all,f[N],tmp[N];
int A[M][M],a[M],cnt[M],tot,w[M][M],C[M][M],D[M][M];
long long K;
int qp(int a,int b){
int c=;
for(;b;b>>=,a=1ll*a*a%mod)
if(b&)c=1ll*c*a%mod;
return c;
}
void UPD(int &a,int b){
a=(a+b>=mod)?(a+b-mod):(a+b);
}
bool can(int x){
for(int i=;i<=x;i++)
for(int j=;j<=x;j++)
if(A[i][j]<=x&&1ll*a[i]*a[j]%mod!=a[A[i][j]])return ;
return ;
}
void dfs(int x){
if(tot==m)return ;
if(x==m){
bool flag=;
for(int i=;i<m;i++)if(a[i])
{flag=;break;}
if(!flag)return ;
for(int i=;i<m;i++)C[i][tot]=a[i];
tot++;
return ;
}
for(int i=;i<=cnt[x];i++){
a[x]=w[cnt[x]][i];
if(can(x))dfs(x+);
}
}
void getni(){
for(int i=;i<m;i++)D[i][i]=;
for(int k=;k<m;k++){
if(!C[k][k]){
for(int i=k+;i<m;i++)if(C[i][k]){
for(int j=;j<m;j++){
swap(C[k][j],C[i][j]);
swap(D[k][j],D[i][j]);
}
}
}
int inv=qp(C[k][k],mod-);
for(int i=;i<m;i++){
C[k][i]=1ll*C[k][i]*inv%mod;
D[k][i]=1ll*D[k][i]*inv%mod;
}
for(int i=;i<m;i++)if(i!=k&&C[i][k]){
int t=C[i][k];
for(int j=;j<m;j++){
UPD(C[i][j],mod-1ll*t*C[k][j]%mod);
UPD(D[i][j],mod-1ll*t*D[k][j]%mod);
}
}
}
}
void dft(int n,int *f,int C[M][M]){
if(n==)return ;
int l=n/m;
for(int i=;i<m;i++)dft(l,f+i*l,C);
for(int i=;i<n;i++)tmp[i]=;
for(int i=;i<m;i++)
for(int j=;j<m;j++)
for(int k=;k<l;k++)
UPD(tmp[j*l+k],1ll*f[i*l+k]*C[i][j]%mod);
for(int i=;i<n;i++)
f[i]=tmp[i];
}
int main(){
//freopen("test.in","r",stdin);
for(int i=,now;i<=;i++){
w[i][]=;
now=qp(rt,(mod-)/i);
for(int j=;j<i;j++)
w[i][j]=1ll*w[i][j-]*now%mod;
}
scanf("%d%d%lld",&n,&m,&K);
K=(K+)%(mod-);
for(int i=;i<m;i++)
for(int j=;j<m;j++)
scanf("%d",&A[i][j]);
for(int i=;i<m;i++){
int now=i;
do{
cnt[i]++;
now=A[now][i];
}while(now!=i);
}
dfs();
all=qp(m,n);
for(int i=;i<all;i++)scanf("%d",&f[i]);
dft(all,f,C);
for(int i=;i<all;i++)f[i]=qp(f[i],K);
getni();
dft(all,f,D);
for(int i=;i<all;i++)printf("%d\n",f[i]);
return ;
}
loj548 「LibreOJ β Round #7」某少女附中的体育课的更多相关文章
- loj #547. 「LibreOJ β Round #7」匹配字符串
#547. 「LibreOJ β Round #7」匹配字符串 题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...
- [LOJ#531]「LibreOJ β Round #5」游戏
[LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...
- [LOJ#530]「LibreOJ β Round #5」最小倍数
[LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...
- [LOJ#516]「LibreOJ β Round #2」DP 一般看规律
[LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- [LOJ#525]「LibreOJ β Round #4」多项式
[LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...
- [LOJ#526]「LibreOJ β Round #4」子集
[LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...
- [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 …… 接着他们发现自己收 ...
- LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力
二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...
随机推荐
- HTML DOM 实例
DOMAnchor 对象 更改一个链接的文本.URL 以及 target 使用 focus() 和 blur() 向超链接添加快捷键 Document 对象 使用 document.write() 向 ...
- sqlplus 分析执行计划
转载 http://xm-koma.iteye.com/blog/1048451 对于oracle9i,需要手工设置plustrace角色,步骤如下: 1.在SQL>connect sys/密码 ...
- Bash的一些零星笔记
1.变量带入操作符 在脚本中,使用变量前做检查是很重要的.通过代入操作符,可以实现这方面的功能.比如当变量未赋值时为变量赋默认值,以及更多内容: ${parameter:-默认为空}:当paramet ...
- .net c#获取自定义Attribute
前言: 在c#开发中,有时候我们需要读取 Attribute中的信息(关于Attribute , 我自己把他理解成一个可以为类,属性标记的东西,这个标记可以为你提供一些关于类,方法,属性的额外信息) ...
- win10 下安装mysql服务器社区版本mysql-5.7.22-winx64
下载 下载: http://dev.mysql.com/downloads/mysql/ 解压到C盘 添加环境变量path 添加环境变量 右击我的电脑->属性->高级系统设置->高级 ...
- MognoDB3.4.2用户访问配置管理
说在前面,官方文档似乎略有瑕疵. 说一下大规则:把绑定IP换成127.0.0.1IP之后,把security的authorization关闭掉做用户添加操作. 添加用户的方法必须是createUser ...
- 利用Tess4J实现图片识别
一.下载 1.进入官网下载页面 https://sourceforge.net/projects/tess4j/ 2.点击download 3.下载后解压,目录如下,圈出的三个文件夹是需要用到的 二. ...
- 强大的代码编辑器 phpstorm version 2016.2 License Server激活
"磨刀不误砍柴工","工欲善其事必先利其器",找个一个好的代码开发编辑工具可以让我们事半功倍,并且代码质量得到保障,在这里就推荐一款强大的代码编辑器,不对其实可 ...
- Fiddler证书安装(查看HTTPS)
现在很多带有比较重要信息的接口都使用了安全性更高的HTTPS,而Fiddler默认是抓取HTTP类型的接口,要想查看HTTPS类型接口就需要安装fiddler证书. fiddler安装教程可参考: ...
- OC和Swift中的UITabBar和UINaviGationBar的适配 [UITabbar在IPad中的适配]
作者 sundays http://www.cnblogs.com/sundaysgarden/ OC中UITabbar的适配[iphoneX和Ipad适配] 自定可以UITabar 自定义UITab ...