hdu 4790 Just Random

题面如下

Coach Pang and Uncle Yang both love numbers. Every morning they play a game with number together. In each game the following will be done:
  1. Coach Pang randomly choose a integer x in [a, b] with equal probability.
  2. Uncle Yang randomly choose a integer y in [c, d] with equal probability.
  3. If (x + y) mod p = m, they will go out and have a nice day together.
  4. Otherwise, they will do homework that day.
  For given a, b, c, d, p and m, Coach Pang wants to know the probability that they will go out.

Input

  The first line of the input contains an integer T denoting the number of test cases.
  For each test case, there is one line containing six integers a, b, c, d, p and m(0 <= a <= b <= 10 9, 0 <=c <= d <= 10 9, 0 <= m < p <= 10 9).

Output

  For each test case output a single line "Case #x: y". x is the case number and y is a fraction with numerator and denominator separated by a slash ('/') as the probability that they will go out. The fraction should be presented in the simplest form (with the smallest denominator), but always with a denominator (even if it is the unit).

Sample Input

4
0 5 0 5 3 0
0 999999 0 999999 1000000 0
0 3 0 3 8 7
3 3 4 4 7 0

Sample Output

Case #1: 1/3
Case #2: 1/1000000
Case #3: 0/1
Case #4: 1/1

这题第一眼做的时候直接用几何概率的做法做了,感觉没毛病但一直wa,然后只能求教大佬了,,

用了容斥+数学思想

 

 #include <iostream>
 #include <algorithm>
 using namespace std;
 long long a,b,c,d,p,m;
 
 long long min(long long a,long long b){
     return a<b?a:b;
 }
 
 long long sol(long long b,long long d){
     ||d<)
         ;
     long long ma,mb;
     ;
     long long tmp;
     ans += (b/p)*(d/p)*p;
     ma = b%p;
     mb = d%p;
     ans += (ma+)*(d/p) + (mb+)*(b/p);
     if(ma>m){
         ans += min(m+,mb+);
         tmp = (p+m-ma)%p;
         );
     }else{
         tmp = (m-ma+p)%p;
         if(tmp<=mb)
             ans += min(m-tmp+,mb-tmp+);
     }
     return ans;
 }
 
 long long gcd(long long a,long long b){
     )
         return a;
     return gcd(b,a%b);
 }
 
 int main()
 {
     int t;
     cin>>t;
     int cnt;
     ;cnt<=t;cnt++){
         cin>>a>>b>>c>>d>>p>>m;
         long long res;
         res = sol(b,d)-sol(b,c-)-sol(a-,d)+sol(a-,c-);
         )*(d-c+));
         long long gcdD = gcd(res ,sum);
         res = res/gcdD;
         sum = sum/gcdD;
         cout<<"Case #"<<cnt<<": ";
         cout<<res<<"/"<<sum<<endl;
     }
     ;
 }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值