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」计算几何瞎暴力 叫做计算几 ...
随机推荐
- angular1.0 app
angular 1.0 简单的说一下就是ng启动阶段是 config-->run-->compile/link config阶段是给了ng上下文一个针对constant与provider修 ...
- 前端技术之_CSS详解第三天
前端技术之_CSS详解第三天 二.权重问题深入 2.1 同一个标签,携带了多个类名,有冲突: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
- Spring Boot Kafka
1.创建集群 http://kafka.apache.org/documentation/#quickstart 有一句我觉得特别重要: For Kafka, a single broker is j ...
- permutations(全排列)
Given a collection of distinct numbers, return all possible permutations. For example,[1,2,3] have t ...
- JVM笔记8-虚拟机性能监控与故障处理工具
1.JDK命令行工具 Java开发人员肯定都知道JDK的bin目录有“java.exe”,"javac.exe"这两个命令行工具,但并非所有程序员都了解过JDK的bin目录之中其他 ...
- spring 配置多数据源(mysql读写分离)
前段时间刚换了家新公司,然后看项目代码里用了数据库读写分离的架构,然后好奇扒了代码简单看了下,总体来说就是运用spring aop切面方式来实现的.看明白后就在自己的个人小项目里运用了下,测试OK,所 ...
- Mysql系列-数据库
一 .数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组 ...
- Ocelot中文文档-Qos服务质量
目前Ocelot支持一种QoS功能. 如果您希望在请求向下游服务时使用断路,则可以在ReRoute中进行设置. 这个功能使用了一个名为Polly的.NET库,这个库很棒,在这里可以找到它. 添加如下配 ...
- python笔记:#006#程序执行原理
程序执行原理(科普) 目标 计算机中的 三大件 程序执行的原理 程序的作用 01. 计算机中的三大件 计算机中包含有较多的硬件,但是一个程序要运行,有 三个 核心的硬件,分别是: CPU 中央处理器, ...
- 瞎捣鼓的code highlight
int a ; int b; public int a ;int b char c; h2 { text-align: left;}.postTitle{ background-color:#F ...