Codeforces Round #956 (Div. 2) and ByteRace 2024

前言

        比赛节奏没把握好,最后时间上出了点问题。

        题目链接:Dashboard - Codeforces Round #956 (Div. 2) and ByteRace 2024 - Codeforces

A. Array Divisibility

        简单构造,容易发现序列 "1,2,3,......,n" 满足条件。

#include<cstdio>
#include<cstring>
using namespace std;

int T,n;

int main()
{
	scanf("%d",&T);
	while (T --)
	{
		scanf("%d",&n);
		for (int i = 1;i <= n;++ i) printf("%d ",i);
		printf("\n");
	}
	return 0;
}

B. Corner Twist

        这可能是本人在 cf 比赛中见过的最难的第二题。

        但与其说难,不如说是脑筋急转弯,弯没转过来就是想不到了。

        首先比较明显的是必要性:由于每次变化,选定矩阵的每一条边所在的行 / 列的变化量 mod 3 都为 0 ,也就是说合法的答案矩阵的每一行和每一列的数字和与原矩阵对应的每一行和每一列的数字和在模 3 的意义下同余

        接下来证明这个条件的充分性:即要证若 A,B 矩阵满足每一行和每一列的数字和在模 3 的意义下同余,则 A,B 矩阵可以互相转化 。首先可以发现所有选定变化矩阵都可以由最小的 2*2 矩阵叠加产生。那么我们可以从(1,1)开始到(n - 1,m - 1)使得 A 中这个(n - 1)*(m - 1)的矩阵变成和 B 中的相同,再根据必要性可知,剩下的这 (n + m - 1)个数字可以通过其所在的行列的数字和 mod 3 确定,于是乎两个矩阵的所有数字都可以相同,充分性证明完毕。

        这样一来判断就易如反掌了。

#include<cstdio>
#include<cstring>
using namespace std;

#define N 505

int T,n,m,a[N][N],b[N][N];
char s[N];

int main()
{
	scanf("%d",&T);
	while (T --)
	{
		scanf("%d%d",&n,&m);
		for (int i = 1;i <= n;++ i)
		{
			scanf("%s",s + 1);
			for (int j = 1;j <= m;++ j) a[i][j] = s[j] - '0';
		}
		for (int i = 1;i <= n;++ i)
		{
			scanf("%s",s + 1);
			for (int j = 1;j <= m;++ j) b[i][j] = s[j] - '0';
		}
		int tot,num,flag;
		flag = 1;
		for (int i = 1;i <= n;++ i)
		{
			tot = num = 0;
			for (int j = 1;j <= m;++ j) tot += a[i][j],num += b[i][j];
			if(tot % 3 != nu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值