Just Random HDU - 4790 思维题(打表找规律)分段求解
Posted qldabiaoge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Just Random HDU - 4790 思维题(打表找规律)分段求解相关的知识,希望对你有一定的参考价值。
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棰橈級 鏁板鎬濊矾棰?瀹规枼