首页 > 试题广场 >

异或

[编程题]异或
  • 热度指数:1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
Cwbc想测试一下他的加密协议,以便防止其他人偷看他给XHRlyb的信。
Cwbc提出了这样一个问题:在区间[a,b]和区间[c,d]中分别等概率随机选择一个整数,两者异或之后等于0的概率是多少?
XHRlyb 一眼就看出了这个题目的答案,但她想让你计算一下这个概率。为了防止精度误差,你只需要输出一个形如a/b的最简分数。特别的,如果概率为0,你需要输出0/1。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!

输入描述:
输入数据有多行,每行有四个非负整数a, b, c, d。


输出描述:
输出数据应有多行,每行有一个表示答案,形如x/y的最简分数。
示例1

输入

1 2 3 4

输出

0/1
示例2

输入

1 2 2 3

输出

1/4

备注:
a, b, c, d∈[0, 109]。
a ≤ b,c ≤ d
1 ≤ 数据组数 ≤ 1000。
头像 小琢卷不动
发表于 2021-11-23 20:21:42
由异或的性质,两个数 x,yx,yx,y 异或和等于 000 当且仅当 x=yx=yx=y。 所以在区间 x∈[a,b],y∈[c,d]x\in[a,b],y\in[c,d]x∈[a,b],y∈[c,d] 中选择两个相同的数的 x,yx,yx,y 的概率: min⁡(b,d)−max⁡(a,c)+1 展开全文
头像 AliLexiWalker
发表于 2026-05-16 00:05:06
因为异或结果等于 0 只有一种情况,就是两个数相等,所以只要算出两个区间的交集有多少个数,再除以两个区间所有组合的总数,就是答案。 void solve(){ ll a,b,c,d; while(cin>>a>>b>>c>>d){ 展开全文
头像 lotusor
发表于 2026-05-16 02:11:42
异或为0只有当两数相等的情况下才行,所以只需求(两数交集大小)//(a数组大小)*(b数组大小),用gcd求出最简表达式即可 from math import gcd import sys input = lambda : sys.stdin.read().strip() op = list(map 展开全文
头像 某位不知名蒟蒻
发表于 2026-05-16 00:49:31
题目链接 异或 思路 前置知识:两个数异或值为,说明这两个数相等。 由此,本题等价于: 在两个区间和中分别取个数,取到的这两个数相等的概率 于是本题答案呼之欲出: 记得约分哦! AC code #include <iostream> #include <algorithm> 展开全文