Examples

2022-6-19 #1 CF1270I & CF1637H

每天都要能选出至少两道有意义的题,这样才算没有摆。

本地记录的话容易鸽掉,就放博客上了。(我博客是不是没啥人看啊)

完了,下午晚上打 CF/AT 去了,今天摆了呜呜。

md,等一下再更。

001 CF1270I Xor on Figures

我们定义两个矩阵 A,B 的异或卷积 C 为:

Ca,b=(u+i)mod2k=a(v+j)mod2k=bAu,vBi,j

我们发现将所有操作放到一个矩阵 P 上,再令关键位置形成的矩阵为 Q,那么我们需要 P×Q=A

可以证明,在异或卷积下,矩阵 A 存在逆元,其值为 A2k1

那么我们就是要求 A×P2k1,但矩阵快速幂的时候暴力实现异或卷积肯定过不了。

发现 P2 只有 (2ximod2k,2yimod2k) 有值,因为 ((xi+xj)mod2k,(yi+yj)mod2k) 会被 (xi,yi),(xj,yj) 计算一次,(xj,yj),(xi,yi) 计算一次,抵消了。

于是 P2l 也只有 O(t) 个位置有值,我们异或卷积的时候取这些位置出来计算即可,复杂度 O(4kkt)

#include<stdio.h>
const int maxn=1<<9;
int n,k,ans,m;
struct matrix{
	unsigned long long a[maxn][maxn];
	inline unsigned long long* operator [](const int &x){
		return a[x];
	}
	matrix operator *(matrix p){
		matrix res;
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				res[i][j]=0;
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				if(p[i][j])
					for(int u=0;u<n;u++)
						for(int v=0;v<n;v++)
							res[(u+i)%n][(v+j)%n]^=p[i][j]*a[u][v];
		return res;
	}
}A,B;
int main(){
	scanf("%d",&k),n=1<<k;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			scanf("%llu",&A[i][j]);
	scanf("%d",&m);
	for(int i=1,x,y;i<=m;i++)
		scanf("%d%d",&x,&y),B[x-1][y-1]=1;
	for(int i=0;i<k;i++)
		A=A*B,B=B*B;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			ans+=(A[i][j]!=0);
	printf("%d\n",ans);
	return 0;
}

002 CF1637H Minimize Inversions Number

posted @   xiaoziyao  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示