题目链接

异或

思路

前置知识:两个数异或值为,说明这两个数相等

由此,本题等价于

在两个区间中分别取个数,取到的这两个数相等的概率

于是本题答案呼之欲出

记得约分哦!

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