这道题好神啊!!!

发现这题就是定义了一种新的卷积,然后做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」某少女附中的体育课的更多相关文章

  1. loj #547. 「LibreOJ β Round #7」匹配字符串

    #547. 「LibreOJ β Round #7」匹配字符串   题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...

  2. [LOJ#531]「LibreOJ β Round #5」游戏

    [LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...

  3. [LOJ#530]「LibreOJ β Round #5」最小倍数

    [LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...

  4. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  5. [LOJ#515]「LibreOJ β Round #2」贪心只能过样例

    [LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...

  6. [LOJ#525]「LibreOJ β Round #4」多项式

    [LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...

  7. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

  8. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 …… 接着他们发现自己收 ...

  9. LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力

    二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...

随机推荐

  1. Python可视化TVTK库初使用

    本周学习了初步的TVTK库的安装及使用方法,第一次通过tvtk.CubeSource方法建立了一个长方体对象.对TVTK的接触有了新的体会. 首先,在网上下载了以下五个库并按顺序通过pip指令在cmd ...

  2. webpack 4.x 遇到的错误

    由于之前重装电脑,很多之前的小Demo 现在都跑不起来.特别是webpack一直在报错. webpack 安装node 全局安装webpack,webpack-cli(一定要全局安装) 项目初始化 w ...

  3. 阅读spring源码

    读Spring源码之前,你要先清楚,为什么你要用Spring... Spring最基本的功能是做为管理bean的容器,所以我以为应该先从org.springframework.context包了解咯, ...

  4. java Map遍历

    http://www.cnblogs.com/fczjuever/archive/2013/04/07/3005997.html 1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entr ...

  5. Java语言概论

    第1章 ■    Java的发展简史及特点 ■    J2SDK的下载与安装 ■    Java应用程序的编写 ■    Eclipse的下载及使用 ■    正确安装使用J2SDK ■    使用记 ...

  6. java面试题之分析(二)

    QUESTION NO:2 package com.cdu.test;  public class Test { static boolean foo(char c) { System.out.pri ...

  7. SpringBoot入门之简单配置

    今天下载了<JavaEE开发的颠覆者SpringBoot实战>这本书,发现Spring还有好多遗漏的部分,算是又恶补了一下,今天主要是学习下SpringBoot的配置. 一.基本配置 1. ...

  8. 动态规划:给出两个字符串s1和s2,返回其中最大的公共子串

    求公共子字符串问题(连续的) 这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!现在想,当时 ...

  9. ccf 目录格式转换

    任务背景: 在网络上获取的ccf目录的格式是PDF,但是要进行数据分析时,PDF格式的数据是不符合要求的,因此需要将pdf格式转化为excel格式 任务目的: 将pdf格式的CCF目录转化为excel ...

  10. Xapth 添加注释头

    private static void updateMybatisXml(String url, String username, String password) { DocumentBuilder ...