hdu 4790 Just Random 神奇的容斥原理


 1 /**
2 大意: 给定[a,b],[c,d] 在这两个区间内分别取一个x,y 使得 (x+y)%p = m
3 思路:res = f(b,d) -f(b,c-1)-f(a-1,d)+f(a-1,c-1); f(b,d ) 表示在[0,b],[0,d] 之间有多少个符合上述要求的数
4 1、将[0,b] 分为两部分, b/p 和 b%p 能整除p的[0,(b/p)*p] 和[(b/p)*p+1,b ] 同理[0,d]也可以这样分, 这样对于[0,b] [0,d ] 分别有两种情况,则一共有四种情况。
5 a、 对于能整除的部分,直接相乘可得结果ans += (b/p)*(d/p)*p;
6 b、 对于b 不能整除的和 d 能整除的。。 ans += (b%p+1)*(d/p)
7 c、 对于d不能整除的和b能整除的。 ans += (d%p+1)*(b/p)
8 d 、 对于 b不能整除和d也不能整除的。。
9 先举下面一个例子
10
11 对于一个完整的区间来说,不难想到[0,m]对应[m,0],那么对于[m+1,p-1]对应哪一个区间呢,一个数a来说,如果a%p=m,则a=m,m+p,m+2*p……由于[0,p-1]中任意两个数的和都小于2*p,因此a只能为m或者m+p,那么[m+1,p-1]就对应着[p-1,m-1]。下面是m=3,p=8的情况
12 0 1 2 3 4 5 6 7
13 3 2 1 0 7 6 5 4
14
15 那么。。ma = b%p mb = d%p。。。
16 若是ma〉m 那么:
17 ans += min(m+1,mb+1);
18 tmp = (p+m-ma)%p;
19 if(tmp<=mb) ans += (mb-tmp+1);
20
21 若是ma〈 m 那么:
22 tmp = (m-ma+p)%p;
23 if(tmp<=mb)
24 ans += min(m-tmp+1,mb-tmp+1);
25 **/
26 ////////////////////////////////////////////////
27 别人的解释。。。
28 总的组合数很容易算出来,也就是两个区间的整数的个数的乘积。接下来是求两个数的和,对于一个区间,我们可以根据区间模p的结果进行划分:[a%p,p-1],[0,p-1],[0,b%p],也就是说把区间中前面和后面不完整的[0,p-1]的区间单独拿出来分析,中间的完整的一起算就好了。接下来是区间中模p等于m的数的个数,对于一个完整的区间来说,不难想到[0,m]对应[m,0],那么对于[m+1,p-1]对应哪一个区间呢,一个数a来说,如果a%p=m,则a=m,m+p,m+2*p……由于[0,p-1]中任意两个数的和都小于2*p,因此a只能为m或者m+p,那么[m+1,p-1]就对应着[p-1,m-1]。下面是m=3,p=8的情况
29 0 1 2 3 4 5 6 7
30 3 2 1 0 7 6 5 4
31 这样一个完整的区间中两个数的和对p取模等于m的对应关系就确定了。接下来就是分区间讨论,对于完整的区间可以完全对应,因此是p,对于不完整的区间,算出它对应的区间,然后跟另一个区间比较,看覆盖的长度就行了。这题想到这应该就没问题了,但是写起来还是挺容易错的。
32 ////////////////////////////////////////////////
33
34 #include <iostream>
35 #include <algorithm>
36 using namespace std;
37 long long a,b,c,d,p,m;
38
39 long long min(long long a,long long b){
40 return a<b?a:b;
41 }
42
43 long long sol(long long b,long long d){
44 if(b<0||d<0)
45 return 0;
46 long long ma,mb;
47 long long ans =0;
48 long long tmp;
49 ans += (b/p)*(d/p)*p;
50 ma = b%p;
51 mb = d%p;
52 ans += (ma+1)*(d/p) + (mb+1)*(b/p);
53 if(ma>m){
54 ans += min(m+1,mb+1);
55 tmp = (p+m-ma)%p;
56 if(tmp<=mb) ans += (mb-tmp+1);
57 }else{
58 tmp = (m-ma+p)%p;
59 if(tmp<=mb)
60 ans += min(m-tmp+1,mb-tmp+1);
61 }
62 return ans;
63 }
64
65 long long gcd(long long a,long long b){
66 if(b==0)
67 return a;
68 return gcd(b,a%b);
69 }
70
71 int main()
72 {
73 int t;
74 cin>>t;
75 int cnt;
76 for(cnt=1;cnt<=t;cnt++){
77 cin>>a>>b>>c>>d>>p>>m;
78 long long res;
79 res = sol(b,d)-sol(b,c-1)-sol(a-1,d)+sol(a-1,c-1);
80 long long sum =(long long ) ((b-a+1)*(d-c+1));
81 long long gcdD = gcd(res ,sum);
82 // cout<<res<<"------------>"<<sum<<endl;
83 res = res/gcdD;
84 sum = sum/gcdD;
85 cout<<"Case #"<<cnt<<": ";
86 cout<<res<<"/"<<sum<<endl;
87 }
88 return 0;
89 }

hdu 4790 Just Random 神奇的容斥原理

时间: 2024-10-10 14:29:10

hdu 4790 Just Random 神奇的容斥原理的相关文章

HDU - 4790 Just Random

题意:求从[a,b],[c,d]两个区间找到两个数使得他们的和%p=m,求概率 思路:我们想办法把区间的左范围化到0,那么结果就相对好弄了,应用容斥原理比直接解答问题简单点,假设f(a,b)是区间[0,a],[0,b]中满足条件的个数,设p=6.m=2 那么第一个区间可以看成 : 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) 那么题目就可以看成:A+C,A+D, B

HDU 4790 Just Random 【构造】

题目链接:传送门 题目大意:给你a, b, c, d, p and m(0 <= a <= b <= 109, 0 <=c <= d <= 109, 0 <= m < p <= 109).让你从 [a, b] 中取出一个x,从[c, d] 中取出一个y,使得(x+y)(mod p)=m,求一共有多少种可能. 看见题目就想到了用构造的想法,讲解构造成二维坐标系,x+y=k*p+m是一条线,求这条线与构造的矩形(由点组成)一共有几个交点,这个矩阵也是有一定

hdu 4790 Just Random 容斥原理+数学

Just Random Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1723    Accepted Submission(s): 483 Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game w

HDU 4790 Just Random 数学

链接:pid=4790">http://acm.hdu.edu.cn/showproblem.php?pid=4790 意:从[a.b]中随机找出一个数字x,从[c.d]中随机找出一个数字y.给出p.m,假设(x+y)%p==m则算成功,问成功的概率是多少. 思路:[a.b]中连续p个数.[c,d]中连续p个数.用这2*p个数进行组合能找到p种的成功组合(详细不证),所以找到[a.b]中p循环的个数x1,[c,d]中p循环的个数y1,则它们组成的成功组合数为p*x1*y1. 然后是处理边界

hdu - 4790 - Just Random(容斥 + 组合数学)

题意:在 [a, b] 取一个整数 x,在 [c, d] 取一个整数 y,求满足 (x + y) % p = m 的 (x, y) 的对数(0 <= a <= b <= 10 ^ 9, 0 <=c <= d <= 10 ^ 9, 0 <= m < p <= 10 ^ 9). 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4790 -->>2013年成都区赛最后一题,当时TLE6次无果....加

hdu 4790 Just Random (2013成都J题) 数学思路题 容斥

题意:在[a,b]  [c,d] 之间,和模p等于m的对数 详见代码 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include<cmath> 5 #define LL long long 6 using namespace std; 7 int T; 8 LL a,b,c,d,p,m; 9 10 LL gcd(LL a, LL b) { 11 return b ?

hdu 4790 Just Random (思路+分类计算+数学)

Problem Description 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 r

HDU 2204 Eddy&#39;s爱好(容斥原理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2204 解题报告:输入一个n让你求出[1,n]范围内有多少个数可以表示成形如m^k的样子. 不详细说了,自己一开始也忽略了三个素数的乘积的乘方的情况. 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6

HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a <= b <= 100000, c=1, c <= d <= 100000, 0 <= k <= 100000) 思路:因为x与y的最大公约数为k,所以xx=x/k与yy=y/k一定互质.要从a/k和b/k之中选择互质的数,枚举1~b/k,当选择的yy小于等于a/k时,可以