首页 > 其他分享 >CFR-857解题报告

CFR-857解题报告

时间:2023-03-10 23:45:24浏览次数:49  
标签:857 int 任意 矩阵 构造 times 异或 解题 CFR

比赛传送门

A. The Very Beautiful Blanket

题意:构造一个 \(n\times m\) 的矩阵,使得任意 \(4\times 4\) 的子矩阵中,左上 \(2\times 2\) 与右下 \(2\times 2\) 的矩阵的异或和,等于右上 \(2\times 2\) 与左下 \(2\times 2\) 的矩阵的异或和。

这个限制看起来非常难以处理,但非常宽松,于是可以想到人为构造一种更强的限制,使得新限制是原限制的充分条件,且较容易构造。

一种容易想到的方式为,只要让任意 \(2\times 2\) 的子矩阵的异或和均为 \(0\),显然可满足要求。以下为两种较简单的构造:

随机

因为任意 \(2\times 2\) 的子矩阵异或和为 \(0\),则只要有三个确定了,第四个唯一确定。于是可以发现,第一行和第一列确定后,就能唯一确定一个 \(n\times m\) 的矩阵(递推即可)。第一行和第一列可以随机,正确率足够通过本题。如果放不下心可以最后加一个判断,不合法则重新随机。

By cxm1024

long long a[210][210];
void Solve(int test) {
	int n, m;
	cin >> n >> m;
	while (1) {
		for (int i = 1; i <= n; i++)
			a[i][1] = abs((long long)(1ull * rand() * rand() * rand()));
		for (int i = 1; i <= m; i++)
			a[1][i] = abs((long long)(1ull * rand() * rand() * rand()));
		for (int i = 2; i <= n; i++)
			for (int j = 2; j <= m; j++)
				a[i][j] = a[i - 1][j - 1] ^ a[i - 1][j] ^ a[i][j - 1];
		// set<int> s;
		// for (int i = 1; i <= n; i++)
		// 	for (int j = 1; j <= m; j++)
		// 		s.insert(a[i][j]);
		// if (s.size() != n * m) continue;
		// 注释部分为判断合法性,不加也可通过
		cout << n * m << endl;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++)
				cout << a[i][j] << " ";
			cout << endl;
		}
		break;
	}
}

人类智慧

第二种为直接构造,思维难度相对较高。对于 \(2\times 2\) 的子矩阵中的元素,考虑在二进制位上分段处理,分为前后两段,前面的段每一行相同,后面的段每一列相同。这样,同行的两个元素异或会把前面的段抵消,同列的两个元素异或会把后面的段抵消,保证异或和为 \(0\)。

实现上,直接令 \(a_{i,j}=i\times 2^k+j\),其中 \(k\) 是足以区分两段的常数(本题中取 \(8\) 以上即可)。

By jiangly

void solve() {
    int n, m;
    std::cin >> n >> m;
    
    std::cout << n * m << "\n";
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            std::cout << (i << 10) + j << " \n"[j == m - 1];
        }
    }
}

其他做法

除此之外,还有很多种其他做法,如对样例找规律、递归分治加位等,但本质上都是要构造使得任意 \(2\times 2\) 的矩阵异或和为 \(0\),这里不再赘述。

标签:857,int,任意,矩阵,构造,times,异或,解题,CFR
From: https://www.cnblogs.com/cxm1024/p/17205014.html

相关文章

  • [Codeforces Round 857 (Div. 1)][Codeforces 1801A~1801G(部分)]
    FST哩,好似!本来能+80的,现在只加了30,相当于掉了50分捏1801A-TheVeryBeautifulBlanket题目大意:要求构造一个\(n\timesm\)的矩阵\(B\),使得对任意一个\(4\times4\)......
  • 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(java解题)
    目录1.题目2.解题思路3.数据类型功能函数总结4.java代码1.题目定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于......
  • 「解题报告」CF1178B WOW Factor
    ¿题目链接这是一道非常富有启发性的题目,值得一做,闪耀着人类和机器人的智慧光辉的绝佳题目.首先注意到(vv)o(vv)的结构,可以考虑枚举中间的o,这样只需要算两边的选法......
  • ABC292解题报告
    比赛传送门E.Transitivity题意:有一张有向图,你需要在其中添加若干条边,满足对于任意\(a\tob,b\toc\),都有\(a\toc\)。求最少的添加边数。\(n,m\le2000\)。首先可......
  • 普冉PY32系列(六) 通过I2C接口驱动PCF8574扩展的1602LCD
    目录普冉PY32系列(一)PY32F0系列32位CortexM0+MCU简介普冉PY32系列(二)UbuntuGCCToolchain和VSCode开发环境普冉PY32系列(三)PY32F002A资源实测-这个型号不简......
  • 剑指 Offer 64. 求 1 + 2 + … + n(java解题)
    目录1.题目2.解题思路3.数据类型功能函数总结4.java代码1.题目求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C......
  • educational round 1796 D & E 解题报告
    Part1D【题意】有一个数组\(\{a_n\}\),给定\(x,k\),现在要将数组内\(k\)个数加上\(x\),其他的数减去\(x\)。问得到的所有可能数组中最大子段和的最大值。\(1\len......
  • CF1799 解题笔记
    A模拟即可。#include<bits/stdc++.h>#defineILinline#defineregregister#defineN50050ILintread(){regintx=0;regcharch=getchar();while(c......
  • ABC-278解题报告
    比赛传送门D.AllAssignPointAdd题意:给你一个数组\(a\),需要支持:全局赋值、单点加、单点查询。做法一维护最近一次全局赋值操作及每个位置在该操作后的增加量,当进......
  • ABC-277解题报告
    比赛传送门B.PlayingCardsValidation题意:有\(n\)个长度为\(2\)的字符串,判断是否满足以下条件:第一个字符为HDCS之一。第二个字符为A23456789TJQK之一。字......