首页 > 其他分享 >P10499 解题报告

P10499 解题报告

时间:2024-09-11 20:29:39浏览次数:11  
标签:xor P10499 报告 int ++ 开关 异或 解题 operatorname

更好的阅读体验

题目传送门

题目大意:

有 \(n\) 个开关,\(0\) 表示关,\(1\) 表示开,每个开关还有带动的开关,若操作一个开关,那么它带动的开关也会相应变换。

现给出这 \(n\) 个开关的初始状态 \(s_i\) 和末状态 \(t_i\),询问有多少种方法能将初始态转变为末态(不考虑操作先后顺序且每个开关至多操作一次)。

思路:

高斯消元解异或方程组经典题。

先考虑将原题抽象成方程组。

令 \(x_i\) 表示第 \(i\) 个开关的操作次数,因为每个开关至多操作一次,所以 \(x_i = 0\) 或 \(x_i = 1\)。

令 \(a_{i, j}\) 表示第 \(i\) 个开关和第 \(j\) 个开关之间的联系,若 \(a_{i, j} = 1\),则表示操作 \(j\) 会带动 \(i\),若 \(a_{i, j} = 0\) 表示无影响,特别的,因为操作自己就相当于带动自己,所以 \(a_{i, i} = 1\)。

再根据操作效果:\(0\) 变 \(1\),\(1\) 变 \(0\),和异或一模一样。

所以可以列出以下方程组:

\[\left\{\begin{matrix} a_{1, 1}x_1 \operatorname{xor} a_{1, 2}x_2 \operatorname{xor} \cdots \operatorname{xor} a_{1, n}x_n = t_1\operatorname{xor} s_1\\ a_{2, 1}x_1 \operatorname{xor} a_{2, 2}x_2 \operatorname{xor} \cdots \operatorname{xor} a_{2, n}x_n = t_2\operatorname{xor} s_2\\ \cdots\\ a_{n, 1}x_1 \operatorname{xor} a_{n, 2}x_2 \operatorname{xor} \cdots \operatorname{xor} a_{n, n}x_n = t_n\operatorname{xor} s_n \end{matrix}\right.\]

异或其实就是不进位加法,所以也可以用高斯消元来解,将加减法换为异或就行了。

这道题要求操作方案数,那么找自由元的数量就好了。因为若某个未知数是自由元,那么它取 \(0\) 和 \(1\) 都可以,于是贡献了两种方案,根据乘法原理,应该把自由元的数量这么多 \(2\) 乘起来,即 \(2^{cnt}\),\(cnt\) 为自由元的数量。

同时由于系数只能为 \(0\) 或 \(1\),所以一个行向量可以压缩为一个二进制整数或者用 bitset 来操作,这样就能一次异或一整行,时间复杂度降低为 \(O(\frac{n^3}{\omega})\),写起来也方便许多。

\(\texttt{Code:}\)

#include <cmath>
#include <bitset>
#include <iostream>

using namespace std;

const int N = 35;

int T;
int n;
bitset<N> a[N];
int ans;

int gauss() {
    int c, r;
    for(c = 0, r = 0; c < n; c++) {
        int t = r;
        for(int i = r + 1; i < n; i++)
            if(a[i][c]) {
                t = i;
                break;
            }
        
        if(!a[t][c]) continue;

        if(t != r) swap(a[t], a[r]);

        for(int i = r + 1; i < n; i++)
            if(a[i][c])
                a[i] = a[i] ^ a[r];
        ++r;
    }
    if(r < n) {
        for(int i = r; i < n; i++) {
            if(a[i][n])
                return -1;
        }
        ans = 1 << n - r;
        return 0;
    }
    return 1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> T;
    while(T--) {
        cin >> n;
        ans = 1;
        int x;
        for(int i = 0; i < n; i++) 
            a[i].reset(), a[i].set(i, 1);
        for(int i = 0; i < n; i++) {
            cin >> x;
            a[i][n] = x;
        }
        for(int i = 0; i < n; i++) {
            cin >> x;
            a[i][n] = a[i][n] ^ x;
        }
        int y;
        while(cin >> x >> y && x && y)
            a[y - 1].set(x - 1, 1);
        int type = gauss();
        if(type >= 0) cout << ans << '\n';
        else cout << "Oh,it's impossible~!!" << '\n';
    }
    return 0;
}

标签:xor,P10499,报告,int,++,开关,异或,解题,operatorname
From: https://www.cnblogs.com/Brilliant11001/p/18408880

相关文章

  • P10315 解题报告
    题目传送门题目大意:有\(n\)个石碑,每个石碑有\(0\simm-1\)共\(m\)种状态,击打一个石碑会带动其他的石碑。若当前石碑的状态是\(s\),则击打或被带动后的状态为\((s+1)\bmodm\)。现给定这\(n\)个石碑的初始状态\(s_i\)、每个石碑带动的石碑及末状态\(t_i\),求每个......
  • P7976 解题报告
    题目传送门题目大意:设函数\(F(x):=(x+1)\bmod3−1\),\(T\)次询问,计算:\[\sum\limits_{i=0}^{n}\sum\limits_{j}F\left({i\choosej}\right)\]思路:看到奇奇怪怪的组合数求和首先考虑\(\text{Lucas}\),将原数在\(3\)进制下拆位,得:\[{i\choosej}=\prod\limits_{k......
  • 基于OpenSSL的密码管理系统-应用密码学课程报告
    第1章概要设计1.1设计目的本研究旨在设计并实现一个基于OpenSSL的密码管理系统,该系统具备密钥对的生成、密钥上传、密钥的核对、身份认证、文件与邮件的加密和解密、数字签名及数字证书管理等常用功能。研究的意义主要体现在以下几个方面:提升网络信息安全水平:通过集成多种密......
  • CTF学习-MISC杂项解题思路
    文件操作与隐写文件类型识别 1.File命令当文件没有后缀名或者有后缀名而无法正常打开时,根据识别出的文件类型来修改后缀名即可正常打开文件。使用场景:不知道后缀名,无法打开文件。格式:filemyheart2.winhex通过winhex.程序中可以查看文件头类型,根据文件头类型判断出......
  • 井下甲烷气体报警器研发(工程教育课程项目报告)
    目录井下甲烷气体报警器研发......................................................................................3一、   项目概况..............................................................................................31.    项目内容...........
  • 【看雪-注册安全分析报告】
    前言由于网站注册入口容易被黑客攻击,存在如下安全问题:暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞所以大部分网站及App都采取图形验证码或滑动验证码等交互解决方案,但在机器学习能力提......
  • 软件项目管理资料总汇(规格说明书;详细设计;测试计划;验收报告)
      前言:在软件开发过程中,文档资料是非常关键的一部分,它们帮助团队成员理解项目需求、设计、实施、测试、验收等各个环节,确保项目的顺利进行。以下是各个阶段的文档资料概述:软件项目管理部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调......
  • 【专题】2024年中国折叠屏手机市场与消费趋势研究报告合集PDF分享(附原数据表
    原文链接:https://tecdat.cn/?p=37645中国智能手机市场目前仍处于整体增长瓶颈期,增长复苏未达预期,消费者换机预期周期不断延长,使得行业对破局点的探寻更为紧迫。与此同时,中端消费者购机呈现出消费降级与升级的分化态势,不过更多人会选择体验更好、配置更优的产品以延长使用时间。ID......
  • 数据结构实验报告1(集合)
    学习目标:        掌握抽象数据类型的表示与实现方法。学习内容:        描述一个集合的抽象数据类型ASet,其中所有元素为整数且所有元素不相同,集合的基本操作包括:由整数数组a[0..n-1]创建一个集合。输出集合中的所有元素。判断一个元素是否在一个集合中。求......
  • 基于django+vueblockly少儿编程在线学习网站【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,编程教育逐渐从高等教育向基础教育渗透,成为培养未来社会创新人才的重要途径。少儿编程作为这一趋势的前沿阵地,其重......