这道题好神啊!!!

发现这题就是定义了一种新的卷积,然后做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. Windows平台安装及配置Hadoop(不借助cygwin)

    由于项目需要,我在VMware上装了几个虚拟机Windows server 2012 R2,并要搭建Hadoop集群.刚刚入门hadoop,一头雾水,然后开始搜各种教程,首先是选用cygwin进行安装 ...

  2. PHP7开启Opcode开启强悍性能

    鸟哥在博客中说,提高PHP 7性能的几个tips,第一条就是开启opcache: 记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, ...

  3. 大型B2C网站高性能可伸缩架构技术探秘

    大型B2C网站高性能可伸缩架构技术探秘 2010-07-21 08:51 狂放不羁 JavaEye 字号:T | T 向您介绍大型B2C网站高性能的网站架构技术,包括缓存的使用.应用程序和数据库的拆分 ...

  4. python常见模块之time,datetime模块

    一.time模块 time模块提供了一些用于管理时间和日期. time模块中时间的表现形式有三种: format_string  格式化的字符串 struct_time     结构化时间 times ...

  5. 实现CString的Format功能,支持跨平台

    #include <string>#include <stdio.h> #include <stdarg.h> std::string& std_strin ...

  6. Drupal7.8的安装注意的问题

    首先推荐在安装之前,首先阅读一下官方的Installation guide ,说实话话,这玩意安装没有Joomla安装那么平滑,大多数问题,guide都会提到.我是先安装后看的这个guide,比较折腾 ...

  7. uwsgi 服务 invalid request block size: 4161 (max 4096)...skip问题的解决

    问题报错: invalid request block size: 4161 (max 4096)...skip 问题原因:默认的uwsgi分配一个小的buffer(4k)来接收每个请求的头信息,如果 ...

  8. windows xp + mysql5.5 + phpmyadmin insert 中文繁體

    windows xp + mysql5.5 + phpmyadmin insert 中文繁體 今天也發生了,無法insert成功的問題: 在phpmyadmin 或doc下連接mysql執行都不行: ...

  9. Ocelot中文文档-GraphQL

    好吧!你明白我的意思Ocelot并不直接支持GraphQL,但有这么多人问起它,我想表明整合graphql-dotnet库是多么容易 请参阅示例项目OcelotGraphQL. 结合使用graphql ...

  10. Java中static关键字和final关键字

    static: 1. 修饰变量,方法 表示静态方法,静态变量. 2. static修饰代码块 static{ } 此种形式为静态代码块,用于初始化同时被final static修饰的变量.(当然,更常 ...