1. 程式人生 > >HDU 4790 Just Random (規律)

HDU 4790 Just Random (規律)

參考部落格:http://www.cnblogs.com/xin-hua/p/3553045.html
題意:給你a,b,c,d,p,ma,b,c,d,p,m,隨機等可能性的選擇一對xyx[a,b]x,y,x∈[a,b]y[c,d]y∈[c,d],如果(x+y)mod  p=m(x+y)\mod p=m,則稱這次選擇是成功的,問選擇的成功率是多少。

思路:題目要求(x+y)(modp)=m(x+y) \pmod p=m,那麼也就是是說(x

mod  p+ymod  p)mod  p=m(x\mod p +y\mod p )\mod p =m
那麼x,yx,y就會變成有周期的.


例如:求f(16,7),p=6,m=2
對於x有:0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3
對於y有:0 1 2 3 4 5 0
很容易知道對於xy中的(0 1 2 3 4 5)對滿足條件的數目為p。
這樣取A集合為(0 1 2 3 4 5 0 1 2 3 4 5),B集合為(0 1 2 3 4)
C集合為(0 1 2 3 4 5),D集合為(0 1)
這樣就可以分成4部分來計算了
f(16,7)=A和C滿足條件的數+A和D滿足條件的數+B和C滿足條件的數+B和D滿足條件的數。

#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl

using namespace std;
typedef long
long ll; typedef unsigned long long ull; const int seed = 131; const int maxn = 1e5 + 5; const int mod = 1e9 + 7; int T; ll a, b, c, d, p, m; ll f(ll x, ll y) { if (x < 0 || y < 0) return 0; ll ma = x % p; ll mb = y % p; ll ca = x / p; ll cb = y / p; ll ans = 0; ans += ca * cb * p; ans += ca * (mb + 1); ans += cb * (ma + 1); if (ma > m) { ans += min(mb, m) + 1; ll t = (p + m - ma) % p; if (t <= mb) ans += mb - t + 1; } else { //ma<=m ll t = ( m - ma) % p; if (t <= mb) ans += min(m - t + 1, mb - t + 1); } return ans; } int main() { scanf("%d", &T); for (int cas = 1; cas <= T; cas++) { scanf("%lld%lld%lld%lld%lld%lld", &a, &b, &c, &d, &p, &m); ll ans1 = f(b, d) - f(a - 1, d) - f(b, c - 1) + f(a - 1, c - 1); ll ans2 = (d - c + 1) * (b - a + 1); ll g = __gcd(ans1, ans2); printf("Case #%d: %lld/%lld\n", cas, ans1 / g, ans2 / g); } return 0; }