前言
比赛节奏没把握好,最后时间上出了点问题。
题目链接: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

最低0.47元/天 解锁文章
981

被折叠的 条评论
为什么被折叠?



