首页 > 其他分享 >AGC039F 做题记录

AGC039F 做题记录

时间:2024-05-07 11:34:19浏览次数:21  
标签:... le 记录 ll maxn 填写 AGC039F define

link

很厉害的一道 Ad-hoc 题!假定我们填写的矩阵为 \(A\)。

直接填写 \(A\) 计算贡献是基本做不到的,考虑挖掘一些神奇的东西。

问题转化:考虑 \(\prod\limits_{i=1}^n \prod \limits_{j=1}^m f(i,j)\) 相当于构造另一个 \(B\) 矩阵,满足 \(B_{i,j}\le \min(A_{i,1...m},A_{1...n,j})\),问矩阵对 \((A,B)\) 的个数。

继续挖掘条件,发现 \(\forall (i,j), \ B_{i,j} \le \min A_{i,1...m} \Leftrightarrow \forall (i,j) , \ A_{i,j} \ge \max B_{i,1...m}\),列同理。

所以我们两边一起跑,设 \(x_i=\max B_{i,1...m},\ y_j=\min A_{1...n,j}\)。

而矩阵对合法的充要条件转化为 \(\forall (i,j) , \ B_{i,j} \le \min(x_i,y_j) \ \wedge \ A_{i,j} \ge \max(x_i,y_j)\),且 \(B_{i,1...m}\) 至少一个等于 \(x_i\),\(A_{1...n,j}\) 至少一个等于 \(y_j\)。

依次填写 \(x_{1...n},y_{1...m}\),设 \(f[k,i,j]\) 表示填写了 \(\le k\) 的数,其中 \(x_{1...n}\) 填写了 \(x\) 个,其中 \(y_{1...m}\) 填写了 \(y\) 个。

考虑在填写 \(x_{1...n},y_{1...m}\) 时一起填写矩阵 \(A,B\)。对于 \(B_{i,j}\),当填写了 \(x_i,y_j\) 中较小者后计算贡献;对于 \(A_{i,j}\),当填写了 \(x_i,y_j\) 中较大者后计算贡献。

考虑从 \(f[i-1,x,y]\) 转移过来,枚举 \(p,q\) 表示 \(x_{1...n},y_{1...m}\) 中等于 \(=k\) 的数的个数。

  • 对于 \(x_s=k,\ y_t<k\),那么 \(A_{s,t}\) 贡献为 \(k-i+1\)。

  • 对于 \(x_s=k,\ y_t\ge k\),那么 \(B_{s,t}\) 贡献为 \(i\),并且对于每个 \(s\) 都至少一个 \(B_{s,t}\) 等于 \(i\)。

  • 对于 \(x_s\le k,\ y_t=k\),那么 \(A_{s,t}\) 贡献为 \(k-i+1\),并且对于每个 \(t\) 都至少一个 \(A_{s,t}\) 等于 \(i\)。

  • 对于 \(x_s>k,\ y_t=k\),那么 \(B_{s,t}\) 贡献为 \(i\)。

枚举的 \(p,q\) 之间显然任何关系,可以分步转移。

预处理一些必要的系数,时间复杂度 \(O(knm(n+m))\)。

启示:

  • 问题转化,深入思考

  • 等价条件转化,使统计变得更方便

  • 利用条件,精准刻画

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define mkp make_pair
#define pir pair<ll,ll>
#define ull unsigned ll
#define pb push_back
#define i128 __int128
using namespace std;
const ll maxn=110;
ll n, m, t, mod;
ll power(ll a,ll b=mod-2){
	ll s=1;
	while(b){
		if(b&1) s=s*a%mod;
		a=a*a%mod; b>>=1;
	} return s;
}
ll f[maxn][maxn], g[maxn][maxn], r[maxn][maxn], c[maxn][maxn], pw[maxn][maxn];
ll P_pw[maxn][maxn][maxn], P_r[maxn][maxn][maxn];
int main(){
	scanf("%lld%lld%lld%lld",&n,&m,&t,&mod);
	c[0][0]=1;
	for(ll i=1;i<=n||i<=m;i++){
		c[i][0]=1;
		for(ll j=1;j<=i;j++)
			c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; 
	}
	for(ll i=1;i<=t;i++) pw[0][i]=1;
	for(ll i=1;i<=n||i<=m;i++)
		for(ll j=1;j<=t;j++) pw[i][j]=pw[i-1][j]*j%mod;
	for(ll i=1;i<=n||i<=m;i++)
		for(ll j=1;j<=t;j++)
			r[i][j]=(power(j,i)-power(j-1,i)+mod)%mod;
	for(ll i=0;i<=n||i<=m;i++)
		for(ll j=1;j<=t;j++){
			P_pw[i][j][0]=P_r[i][j][0]=1;
			for(ll k=1;k<=n||k<=m;k++)
				P_pw[i][j][k]=P_pw[i][j][k-1]*pw[i][j]%mod,
				P_r[i][j][k]=P_r[i][j][k-1]*r[i][j]%mod;
		}
	f[0][0]=1;
	for(ll k=1;k<=t;k++){
		memset(g,0,sizeof g); 
		for(ll i=0;i<=n;i++)
			for(ll j=0;j<=m;j++){
				for(ll x=0;i+x<=n;x++){
					g[i+x][j]=(g[i+x][j]+f[i][j]*P_r[m-j][k][x]%mod*
					P_pw[j][t-k+1][x]%mod*c[n-i][x])%mod;
				}
			}
		memset(f,0,sizeof f); 
		for(ll i=0;i<=n;i++)
			for(ll j=0;j<=m;j++){
				for(ll y=0;j+y<=m;y++){
					f[i][j+y]=(f[i][j+y]+g[i][j]*P_pw[n-i][k][y]%mod*
					P_r[i][t-k+1][y]%mod*c[m-j][y])%mod;
				}
			}
	} printf("%lld",f[n][m]);
	return 0;
}

标签:...,le,记录,ll,maxn,填写,AGC039F,define
From: https://www.cnblogs.com/Sktn0089/p/18176943

相关文章

  • 云渲染实施记录(暂未跑通)
    大家好,本文记录了尝试跑通云渲染的过程,目前暂时没有跑通,不过已经有了方向目录基本原理1.租GPU服务器2.部署到云渲染平台未来方向更多参考资料相关文章:数字孪生云渲染整体架构设计本文尝试把基于WebGPU-Node的路径追踪渲染器部署到云端,以云渲染/云游戏的方式渲染到客户端,从而......
  • 10.3顺序表的初始化以及插入实战(早期学习笔记记录)
    命名规范1.下划线命名法list_insert不同的单词用下划线连接2.驼峰命名法ListInsert每个单词首字母大写一切数据结构考的都是增(插入)删查改插入思路1、判断插入位置是否合法1<=i<=lenthif(i<1||i>lenth){returnfalse;}2、判断储存空间是否已满(插入数据后......
  • 记录一下docker踩坑 /dev/shm目录
    /dev/shm是Linux系统中的一个特殊目录,用于作为临时文件存储的一种形式,它将数据存储在RAM(随机存取存储器)中,而不是在磁盘上。这意味着在/dev/shm中存储的数据访问速度非常快,但数据在系统重启后不会被保留。/dev/shm是POSIX共享内存(POSIXSharedMemory)的一部分,它允许不同的进程(程序......
  • C#中的记录(record)简介
    record是一种语法糖。标准的record用法有“recordclass”和"recordstruct"两种,分别表示记录类和记录构造。是“引用”和“值”的差别。单独使用record表示"recordclass"。语法:脱胎于构造函数。 recordPerson(stringXm,intNl); 或者recordPerson(stringXm,intNl)......
  • 项目重构经验记录
    需求:目前公司内部有一个项目,leader不想给外包做了,想收回来自己做。我看过之后发现继续重构维护成本有点大,遂决定重构。外包技术栈:前端vue2.0,后端C#,数据库sqlserver由于我既不会C#,也不会sqlserver,所以决定写项目。遇到的第一个难题是,因为项目已经上线有了部分用户数据,该部分的数......
  • 2024.05 别急记录
    1.POI2015-Podziałnaszyjnika考虑对每个位置附一个随机权值,保证序列中所有等于某个数的位置权值异或和为\(0\)。则一种划分合法当且仅当两个区间异或和都为\(0\),相当于找到一个区间\([L,R]\)异或和为\(0\)。于是用umap记录前缀异或和即可。第二问把每个相同的前缀异......
  • 拂衣天气(微天气 )程序发布记录
    前言服务端部署:由于并没有建立全链路的自动化部署,目前还需要到云服务器上进行环境制作(数据库,Nginx),并拉取后端服务进行部署小程序发布:需要先完成服务端部署,保证应用正常可用服务端部署数据库安装与数据初始化最开始的时候,我是直接将在操作系统上面安装数据库,后面发现迁移的......
  • 【网络自动化运维】使用pythonping检查设备的连通性并记录可达设备(eNSP模拟器)
    实验拓扑:PC的IP地址和五台交换机的地址在同一网段,具体IP如图所示。现在保证直连网络能够通信,并且故意将SW5的接口shutdown掉,保证无法联通,作为对照的测试设备。在PC上运行python代码,测试与五台交换机的连通性。由于本次测试使用的是pythonping模块,这并不是python自带的模块,需要......
  • DHU网络攻防靶场攻击记录
    DHU网络靶场攻击记录已知:靶场入口10.199.227.xxx不完整的网络拓扑图:环境准备:kali/wsl-kali/虚拟机kali以及windows或其他操作系统的本机工具准备:Fscannmaplaravel-CVE-2021-3129-EXP-main哥斯拉Burpsuitemsfconsole(主要)目录DHU网络靶场攻击记录如何挂代理入口处机......
  • FFmpeg常用命令案例记录
    音频转换mp3为ogg格式ffmpeg-iinput.mp3-c:alibvorbisoutput.ogg降低音量(例如50%)ffmpeg-iinput.mp3-af"volume=0.5"output.mp3视频转换mkv为mp4并进行无损压缩ffmpeg-iinput.mkv-c:vlibx264-crf18-presetslow-c:acopyoutput.mp4转换4K为10......