zoukankan      html  css  js  c++  java
  • Just Random HDU

    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

    给出 a<=x<=b c<=y<=d 求满足 (x+y) % p ==m 的概率
    这题需要找规律 然后根据规律求解
    每一个数出现的次数为 上升的等差数列 相同的值 下降的等差数列
    以下看规律

    1 0 5 0 5 3 0
    2 0 1 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 7 7 7 7 8 8 8 9 9 10
    3 3 7 2 5 4 6
    4 5 6 6 7 7 7 8 8 8 8 9 9 9 9 10 10 10 11 11 12
    5 1 3 2 6 2 5
    6 3 4 4 5 5 5 6 6 6 7 7 7 8 8 9

      然后根据等差数列求和 求解

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <set>
     7 #include <iostream>
     8 #include <map>
     9 #include <stack>
    10 #include <string>
    11 #include <vector>
    12 #define  pi acos(-1.0)
    13 #define  eps 1e-6
    14 #define  fi first
    15 #define  se second
    16 #define  lson l,m,rt<<1
    17 #define  rson m+1,r,rt<<1|1
    18 #define  rtl   rt<<1
    19 #define  rtr   rt<<1|1
    20 #define  bug         printf("******
    ")
    21 #define  mem(a,b)    memset(a,b,sizeof(a))
    22 #define  name2str(x) #x
    23 #define  fuck(x)     cout<<#x" = "<<x<<endl
    24 #define  f(a)        a*a
    25 #define  sf(n)       scanf("%d", &n)
    26 #define  sff(a,b)    scanf("%d %d", &a, &b)
    27 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
    28 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
    29 #define  pf          printf
    30 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
    31 #define  FREE(i,a,b) for(i = a; i >= b; i--)
    32 #define  FRL(i,a,b)  for(i = a; i < b; i++)
    33 #define  FRLL(i,a,b) for(i = a; i > b; i--)
    34 #define  FIN         freopen("in.txt","r",stdin)
    35 #define  gcd(a,b)    __gcd(a,b)
    36 #define  lowbit(x)   x&-x
    37 using namespace std;
    38 typedef long long  LL;
    39 typedef unsigned long long ULL;
    40 const int mod = 1e9 + 7;
    41 const int maxn = 1e5 + 10;
    42 const int INF = 0x3f3f3f3f;
    43 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
    44 int _;
    45 LL  a, b, c, d, m, p;
    46 LL solveL ( LL L, LL R ) {
    47     LL cnt = L % p;
    48     if ( cnt > m )  cnt = L + p - cnt + m;
    49     else cnt = L + m - cnt ;
    50     if ( cnt > R ) return 0;
    51     else {
    52         int temp = cnt - ( a + c ) + 1;
    53         int num = ( R - cnt ) / p + 1;
    54         LL sum = 1LL * temp * num + 1LL * num * ( num - 1 ) * p / 2;
    55         return sum;
    56     }
    57 }
    58 LL solveM ( LL L, LL R ) {
    59     LL cnt = L % p;
    60     if ( cnt > m )  cnt = L + p - cnt + m;
    61     else cnt = L + m - cnt ;
    62     if ( cnt > R ) return 0 ;
    63     else {
    64         LL temp = L - ( a + c ) + 1;
    65         LL num = ( R - cnt ) / p + 1;
    66         LL sum = 1LL * temp * num;
    67         return sum;
    68     }
    69 }
    70 LL solveR ( LL L, LL R ) {
    71     LL cnt = L % p;
    72     if ( cnt > m )  cnt = L + p - cnt + m;
    73     else cnt = L + m - cnt ;
    74     if ( cnt > R ) return 0 ;
    75     else {
    76         LL temp =  ( b + d ) - cnt  + 1;
    77         LL num = ( R - cnt ) / p + 1;
    78         LL sum = 1LL * temp * num - 1LL * num * ( num - 1 ) *  p / 2;
    79         return sum;
    80     }
    81 }
    82 int main() {
    83     sf ( _ );
    84     int cas = 1;
    85     while ( _-- ) {
    86         scanf ( "%lld%lld%lld%lld%lld%lld", &a, &b, &c, &d, &p, &m );
    87         LL L = a + c, R = b + d, l = min ( b + c, a + d ), r = max ( b + c, a + d ), ans = 0;
    88         ans += solveL ( L, l - 1 );
    89         ans += solveM ( l, r );
    90         ans += solveR ( r + 1, R );
    91         LL sum = ( b - a + 1 ) * ( d - c + 1 );
    92         LL g = gcd ( ans, sum );
    93         printf ( "Case #%d: %lld/%lld
    ", cas++, ans / g, sum / g );
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    新年新气象,用新年的喜庆来迎接的生活
    vs2005中如何发布网站及打包web项目生成安装文件
    完整打印页面控件的解决方案
    vi使用体会
    向ATL DLL中传递C++对象
    CentOS 5.3配置软件源以及CVS服务器
    堆上多维数组的内存管理
    物理坐标与逻辑坐标
    好友列表的实现
    在STL中处理对象指针
  • 原文地址:https://www.cnblogs.com/qldabiaoge/p/9703858.html
Copyright © 2011-2022 走看看