题目链接
思路
前置知识:两个数异或值为,说明这两个数相等。
由此,本题等价于:
在两个区间和
中分别取
个数,取到的这两个数相等的概率
于是本题答案呼之欲出:
记得约分哦!
AC code
#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
ll gcd(ll a, ll b) // a < b,我习惯于自己写gcd函数
{
while( a ){
ll tmp = b % a;
b = a;
a = tmp;
}
return b;
}
int main() {
ll a, b, c, d;
while( cin >> a >> b >> c >> d ){
ll up = max(0LL, min(b, d)-max(a, c)+1), down = (b-a+1) * (d-c+1);
ll g = gcd(up, down);
cout << up/g << '/' << down/g << '\n';
}
return 0;
}
关于为什么没有专门特判up=0的情况,这是因为这种特判是没必要的,理由如下:
我们知道0可以被任意非0整数整除(因为0除以任何非零整数都得0),那意味着如果,必然会有
。显然,
,所以经过约分后必然会算出
0/1的结果
那down有可能为吗?答案是不可能。这是因为,题面中有
,必然有
,即
,不可能是0

京公网安备 11010502036488号