zoukankan      html  css  js  c++  java
  • 选拔赛 c 武器大师的宝贝

    Description

     

    武器大师有两堆宝贝箱子,每个箱子都有着自己的一个编号。

    为了输入方便,每堆箱子编号都是连续的。

    现在他想分别从两堆箱子中各等概率的选择一个箱子,但是只有他选择的两个箱子编号异或(位运算)之后为0,他才能获得奖励。

    现在他想请你算算每次他能获得奖励的概率。

    为了防止精度误差,你需要输出一个形如a/b的最简分数

    特别的,如果概率为0,你需要输出0/1。

    (有人不知道啥是异或吗?

    Input

     

    第一行一个正整数T(1<=T<=1000),表示数据组数。

    接下来每一行都有一组数据,每组数据输入4个整数a,b,c,d,表示两堆箱子的编号区间分别为[a,b],[c,d]。

    (a, b, c, d∈[0, 1e9],a ≤ b,c ≤ d)

    Output

     

    对每组数据输出他能获得奖励的概率。一个形如a/b的最简分数。

    特别的,如果概率为0,你需要输出0/1。

    Sample Input 1 

    8
    1 2 2 3
    1 2 2 4
    1 1 1 1
    1 1 2 2
    829 24970 7181 23584
    1689 21354 18463 48102
    1 2 1 2
    100 100 2 17

    Sample Output 1

    1/4
    1/6
    1/1
    0/1
    1/24142
    241/48575020
    1/2
    0/1

    Hint

    样例一:有两堆箱子,第一堆箱子有2个箱子,编号为分别为1,2。第二堆箱子也有2个箱子,编号为2,3。只有当选择的箱子对是(2,2)时他才能获得奖励。

    解释位运算异或:0^0=0,0^1=1,1^0=1,1^1=0.

    例如:3^5 = 011^101=110

    Source

    2019年集训队选拔赛

    讲道理,异或,看他两个同不同就行,一样异或的结果就是0

    所就是看一个区间里的数在不在后面那个区间就行了

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+7;
    #define INF 0x3f3f3f3f;
    #define ll long long
    bool isEven(ll x)
    {
        if ((x & 1) == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    ll gcd(ll x, ll y)
    {
        if (x < y)
        {
            return gcd(y, x);
        }
    
        if (y == 0)
        {
            return x;
        }
        else
        {
            if (isEven(x))
            {
                if (isEven(y))
                {
                    return (gcd(x >> 1, y >> 1) << 1);
                }
                else
                {
                    return gcd(x >> 1, y);
                }
            }
            else
            {
                if (isEven(y))
                {
                    return gcd(x, y >> 1);
                }
                else
                {
                    return gcd(y, x - y);
                }
            }
        }
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            ll a,b,c,d;
            ll sum=0;
            cin>>a>>b>>c>>d;
            for(ll i=a; i<=b; i++)
            {
                if(i>=c&&i<=d)
                    sum++;
            }
            ll z=(b-a+1)*(d-c+1);
            if(sum==0)
                cout<<"0/1"<<endl;
            else if(sum==z)
                cout<<"1/1"<<endl;
            else
            {
                ll q=gcd(sum,z);
                cout<<sum/q<<"/"<<z/q<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    Java实现各种内部排序算法
    Java实现堆排序(大根堆)
    Java对象的序列化和反序列化
    Java实现链式存储的二叉查找树(递归方法)
    337. House Robber III(包含I和II)
    318. Maximum Product of Word Lengths
    114. Flatten Binary Tree to Linked List
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    96. Unique Binary Search Trees(I 和 II)
  • 原文地址:https://www.cnblogs.com/tp25959/p/10467099.html
Copyright © 2011-2022 走看看