目录

  • 题目
  • 解题思路
  • C++代码
  • Java代码(带注释)

题目

农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题。

约翰给贝茜出了一道相当难的问题,导致她没能解决。

现在,她希望通过给约翰出一道有挑战性的难题来报复他。

贝茜给了约翰一个表达式 (B+E+S+S+I+E)(G+O+E+S)(M+O+O),其中包含七个变量 B,E,S,I,G,O,M(O 是变量,不是零)。

对于每个变量,她给约翰一个列表,表中包含该变量可采用的最多 20 个整数值。

她要求约翰计算,共有多少种给变量赋值的方法可以使得表达式的计算结果偶数。

输入格式
第一行包含一个整数 N。

接下来 N 行,每行包含一个变量和该变量的一个可能值。

每个变量至少出现 1 次,最多出现 20 次。

同一变量不会重复列出同一可能值。

输出格式
输出可以使得表达式的计算结果是偶数的给变量赋值的方法总数。

数据范围
7≤N≤140,
所有变量的可能取值范围 [−300,300]
输入样例:

10
B 2
E 5
S 7
I 10
O 16
M 19
B 3
G 1
I 9
M 2

输出样例:

6

样例解释
共有 6 种可能的赋值方式:

(B,E,S,I,G,O,M) = (2, 5, 7, 10, 1, 16, 19) -> 53,244= (2, 5, 7, 10, 1, 16, 2 ) -> 35,496= (2, 5, 7, 9,  1, 16, 2 ) -> 34,510= (3, 5, 7, 10, 1, 16, 2 ) -> 36,482= (3, 5, 7, 9,  1, 16, 19) -> 53,244= (3, 5, 7, 9,  1, 16, 2 ) -> 35,496

注意,(2, 5, 7, 10, 1, 16, 19) 和 (3, 5, 7, 9, 1, 16, 19),虽然计算结果相同,但是赋值方式不同,所以要分别计数。

解题思路

首先,题目中的式子为
(B+E+S+S+I+E)(G+O+E+S)(M+O+O)(B+E+S+S+I+E)(G+O+E+S)(M+O+O) (B+E+S+S+I+E)(G+O+E+S)(M+O+O)
可以化简为
(B+I+2E+2S)(E+G+O+S)(M+2O)(B+I+2E+2S)(E+G+O+S)(M+2O) (B+I+2E+2S)(E+G+O+S)(M+2O)

因为题目中要求结果为偶数即可
而偶数+偶数 = 偶数
奇数+偶数 = 奇数

所以每一项里的偶数对每一项的奇偶没有影响,即2E,2S,2O并不会影响最终结果所以式子可以化简为
M(B+I)(E+G+O+S)M(B+I)(E+G+O+S) M(B+I)(E+G+O+S)
且式子中 7 个变量均出现了,所以去掉其中的偶数项不会影响方案数

又因为偶数*偶数 = 偶数
奇数*偶数 = 偶数
所以只要这三项中有一项为偶数即可,其他两项中的数可以随意组合

设某变量为 0 时代表该变量为偶数,为 1 时代表该变量为奇数
那么当 M 为偶数时,即 M 的状态为 0 时,最后结果必为偶数,其他数的所有组合均为可行解
当 B 和 I 都为偶数或者都为奇数时,即两者状态相同,均为 0 或者均为 1 时,即两者异或等于 0 时,最后结果必为偶数,其他数的所有组合均为可行解
当 E,G,O,S 都为偶数,或者都为奇数,或者两奇两偶时,即奇数的个数为偶数个时,即四者状态异或为 0 时,最后结果必为偶数,其他数的所有组合均为可行解

每一个可行解的方案数=∏j=06第j个变量当前状态(偶数/奇数)的个数每一个可行解的方案数=\prod\limits_{j = 0}^6 第 j 个变量当前状态(偶数/奇数)的个数 每一个可行解的方案数=j=0∏6​第j个变量当前状态(偶数/奇数)的个数

总方案数就是将每一个方案数相加

C++代码

#include<iostream>
#include<map>using namespace std;int n;
int res = 0;
int count[7][2];
std::map<char,int> key;int main()
{std::ios::sync_with_stdio(false);key['M'] = 6;key['B'] = 5;key['I'] = 4;key['E'] = 3;key['G'] = 2;key['O'] = 1;key['S'] = 0;cin >> n;for(int i = 0; i < n; i++){char ch;int x;cin >> ch >> x;if(x % 2 == 0) count[key[ch]][0]++;else count[key[ch]][1]++;}for(int i = 0; i < 1 << 7; i++){bool m = (i >> 6) & 1;bool b_i = ((i >> 5) & 1) ^ ((i >> 4) & 1);bool e_g_o_s = ((i >> 3) & 1) ^ ((i >> 2) & 1) ^ ((i >> 1) & 1) ^ (i & 1);if(!m || !b_i || !e_g_o_s){int temp = 1;for(int j = 0; j < 7; j++) temp *= count[j][(i >> j) & 1];res += temp;}}cout << res << endl;
}

Java代码(带注释)

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int sum = 0;Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();map.put('M', 6);map.put('B', 5);map.put('I', 4);map.put('E', 3);map.put('G', 2);map.put('O', 1);map.put('S', 0);int[][] count = new int[7][2];    // 存储每个变量偶数和奇数的个数,分别对应下标 0 和 1for(int i = 0; i < n; i++) {char ch = sc.next().toCharArray()[0];int x = sc.nextInt();if(x % 2 == 0) count[map.get(ch)][0]++;  // 记录该变量偶数的个数else count[map.get(ch)][1]++;    // 记录该变量奇数的个数}/** M * (B + I) * (E + G + O +S)* 设选偶数为 0,选奇数为 1* 总共有 2^7 种排列方式,即[00000000-10000000)*/for(int i = 0; i < 1 << 7; i++) {boolean m = (i >> 6 & 1) == 0;  // 若最高位为 0,则说明该位为偶数,即结果必为偶数,否则该位为奇数,结果未知// 若第 5位和第 4位异或为 0,则说明两个全 0或者全 1,即全奇或者全偶,即结果必为偶数,若异或为1,则一奇一偶,结果未知boolean b_i = ((i >> 5 & 1) ^ (i >> 4 & 1)) == 0; // 若第 3、2、1、0位异或为 0,则说明 0和 1的个数均为偶数,即奇数和偶数的个数均为偶数个,即结果必为偶数,若异或结果为 1,说明有奇数个奇数,结果未知boolean e_g_o_s = ((i >> 3 & 1) ^ (i >> 2 & 1) ^ (i >> 1 & 1) ^ (i & 1)) == 0;int temp = 1;// 若三项中有任意一项为偶数,则乘积必为偶数if(m || b_i || e_g_o_s) { for(int j = 0; j < 7; j++) {temp *= count[j][(i >> j) & 1];    // 若该变量选择了偶数/奇数(0/1),则乘上该变量偶数/奇数的个数(count[j][0/1])}sum += temp;   // 加入总方案数种}}System.out.println(sum);sc.close();}}

AcWing 1875.贝茜的报复相关推荐

  1. 1875.贝茜的报复

    Powered by:NEFU AB-IN Link 文章目录 1875.贝茜的报复 题意 思路 代码 1875.贝茜的报复 题意 农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题. 约翰给贝茜出了一道相 ...

  2. 1875 贝茜的报复(dfs、二进制)

    1. 问题描述: 农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题.约翰给贝茜出了一道相当难的问题,导致她没能解决.现在,她希望通过给约翰出一道有挑战性的难题来报复他.贝茜给了约翰一个表达式 (B+E+S ...

  3. 1875. 贝茜的报复

    题目描述 农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题. 约翰给贝茜出了一道相当难的问题,导致她没能解决. 现在,她希望通过给约翰出一道有挑战性的难题来报复他. 贝茜给了约翰一个表达式 (B+E+S+ ...

  4. 寒假每日一题——贝茜的报复

    贝茜的报复 问题描述 农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题. 约翰给贝茜出了一道相当难的问题,导致她没能解决. 现在,她希望通过给约翰出一道有挑战性的难题来报复他. 贝茜给了约翰一个表达式 ( ...

  5. AcWing 1934. 贝茜放慢脚步(二路归并)

    题目链接 https://www.acwing.com/problem/content/description/1936/ 思路 题目的标签是二路归并,其实就是贪心,可以对比我们之前学习归并算法那里, ...

  6. 贝茜的报复(dfs + 位运算)

    原题链接 本题关键在于二进制的转化,如果直接枚举每个字母(共7个字母)的20种可能就会TLE 另外需要了解以下公式: #include <iostream> #include <cs ...

  7. [BZOJ1643][Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪

    1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: ...

  8. BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划

    题目 1613: [Usaco2007 Jan]Running贝茜的晨练计划 Time Limit: 5 Sec  Memory Limit: 64 MB Description 奶牛们打算通过锻炼来 ...

  9. bzoj 3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题(DP)

    3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: ...

最新文章

  1. Oracle Exadata 简介
  2. ConcurrentHashMap源码解析(2)
  3. php 获取文件后缀_php获取文件后缀的9种方法
  4. HDU - 5316 Magician(线段树区间合并)
  5. 代码与html混合,自定义的标签与html的标签混合应用_css
  6. 分享25个高质量的移动设备wordpress主题(Mobile theme)
  7. 快速打开 Mac OS X 隐藏的用户资源库文件夹
  8. Animate:基础学习
  9. SVN 安装与使用教程 2020年9月更新最新教程
  10. C语言在数组中查找特定整数,c语言在数组中查找某个元素
  11. 东原服务器开机显示bb,启用tls后,服务器出现remote error: tls: bad certificate
  12. Google Earth Engine APP(GEE)——用一个选择器选择不同城市的应用
  13. android群聊红包原理,Android之微信抢红包实现原理分析
  14. 音质媲美入耳式耳机,设计时尚续航出色,南卡Runner Pro 4体验
  15. 使用 ifconfig 查看本机 ip
  16. Html和css 两张图片叠加一起
  17. 【案例】中国银联、光大银行基于区块链的可信电子凭证系统
  18. MetaQ中间件原理浅析
  19. 允许 流程 强制收回
  20. 《 敏捷软件开发》已开始连载

热门文章

  1. 罗克韦尔自动化通过收购ASEM加强控制和可视化产品组合
  2. DXP_protel2004_原理图设计基础_新建和添加原理图库文件
  3. 前端知识零零散散,如何高效学习?
  4. 国际计算机网络与信息安全博览会,2018中国(成都)国际计算机网络及信息安全展览会暨论坛...
  5. web前端期末大作业 html+css+javascript网页设计实例 企业网站制作内容
  6. 让你的APP实现即时聊天功能
  7. 扩展欧几里得算法及贝祖定理的证明
  8. 2022年广东省安全员A证第三批(主要负责人)考试练习题及在线模拟考试
  9. python多进程和进程池
  10. java图形界面计算器_java图形界面 计算器实现