Just Random HDU - 4790 思维题(打表找规律)分段求解

Posted qldabiaoge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Just Random HDU - 4790 思维题(打表找规律)分段求解相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于Just Random HDU - 4790 思维题(打表找规律)分段求解的主要内容,如果未能解决你的问题,请参考以下文章

hdu 4790 Just Random 锛?013鎴愰兘J棰橈級 鏁板鎬濊矾棰?瀹规枼

Just a Hook HDU - 1698Just a Hook HDU - 1698 线段树区间替换

hdu 1698 Just a Hook

Just a Hook HDU - 1698

HDU - 1698 Just a Hook

HDU - 1698 Just a Hook