HDU 4790 Just Random (規律)
阿新 • • 發佈:2019-01-08
參考部落格:http://www.cnblogs.com/xin-hua/p/3553045.html
題意:給你,隨機等可能性的選擇一對,,如果,則稱這次選擇是成功的,問選擇的成功率是多少。
思路:題目要求,那麼也就是是說
那麼就會變成有周期的.
例如:求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;
}