/**
大意: 给定[a,b],[c,d] 在这两个区间内分别取一个x,y 使得 (x+y)%p = m
思路:res = f(b,d) -f(b,c-1)-f(a-1,d)+f(a-1,c-1); f(b,d ) 表示在[0,b],[0,d] 之间有多少个符合上述要求的数
1、将[0,b] 分为两部分, b/p 和 b%p 能整除p的[0,(b/p)*p] 和[(b/p)*p+1,b ] 同理[0,d]也可以这样分, 这样对于[0,b] [0,d ] 分别有两种情况,则一共有四种情况。
a、 对于能整除的部分,直接相乘可得结果ans += (b/p)*(d/p)*p;
b、 对于b 不能整除的和 d 能整除的。。 ans += (b%p+1)*(d/p)
c、 对于d不能整除的和b能整除的。 ans += (d%p+1)*(b/p)
d 、 对于 b不能整除和d也不能整除的。。
先举下面一个例子 对于一个完整的区间来说,不难想到[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的情况
0 1 2 3 4 5 6 7
3 2 1 0 7 6 5 4 那么。。ma = b%p mb = d%p。。。
若是ma〉m 那么:
ans += min(m+1,mb+1);
tmp = (p+m-ma)%p;
if(tmp<=mb) ans += (mb-tmp+1); 若是ma〈 m 那么:
tmp = (m-ma+p)%p;
if(tmp<=mb)
ans += min(m-tmp+1,mb-tmp+1);
**/
////////////////////////////////////////////////
别人的解释。。。
总的组合数很容易算出来,也就是两个区间的整数的个数的乘积。接下来是求两个数的和,对于一个区间,我们可以根据区间模p的结果进行划分:[a%p,p-],[,p-],[,b%p],也就是说把区间中前面和后面不完整的[,p-]的区间单独拿出来分析,中间的完整的一起算就好了。接下来是区间中模p等于m的数的个数,对于一个完整的区间来说,不难想到[,m]对应[m,],那么对于[m+,p-]对应哪一个区间呢,一个数a来说,如果a%p=m,则a=m,m+p,m+*p……由于[,p-]中任意两个数的和都小于2*p,因此a只能为m或者m+p,那么[m+,p-]就对应着[p-,m-]。下面是m=,p=8的情况 这样一个完整的区间中两个数的和对p取模等于m的对应关系就确定了。接下来就是分区间讨论,对于完整的区间可以完全对应,因此是p,对于不完整的区间,算出它对应的区间,然后跟另一个区间比较,看覆盖的长度就行了。这题想到这应该就没问题了,但是写起来还是挺容易错的。
//////////////////////////////////////////////// #include <iostream>
#include <algorithm>
using namespace std;
long long a,b,c,d,p,m; long long min(long long a,long long b){
return a<b?a:b;
} long long sol(long long b,long long d){
if(b<||d<)
return ;
long long ma,mb;
long long ans =;
long long tmp;
ans += (b/p)*(d/p)*p;
ma = b%p;
mb = d%p;
ans += (ma+)*(d/p) + (mb+)*(b/p);
if(ma>m){
ans += min(m+,mb+);
tmp = (p+m-ma)%p;
if(tmp<=mb) ans += (mb-tmp+);
}else{
tmp = (m-ma+p)%p;
if(tmp<=mb)
ans += min(m-tmp+,mb-tmp+);
}
return ans;
} long long gcd(long long a,long long b){
if(b==)
return a;
return gcd(b,a%b);
} int main()
{
int t;
cin>>t;
int cnt;
for(cnt=;cnt<=t;cnt++){
cin>>a>>b>>c>>d>>p>>m;
long long res;
res = sol(b,d)-sol(b,c-)-sol(a-,d)+sol(a-,c-);
long long sum =(long long ) ((b-a+)*(d-c+));
long long gcdD = gcd(res ,sum);
// cout<<res<<"------------>"<<sum<<endl;
res = res/gcdD;
sum = sum/gcdD;
cout<<"Case #"<<cnt<<": ";
cout<<res<<"/"<<sum<<endl;
}
return ;
}

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

  1. HDU 4790 Just Random 数学

    链接:pid=4790">http://acm.hdu.edu.cn/showproblem.php?pid=4790 意:从[a.b]中随机找出一个数字x,从[c.d]中随机找出一个 ...

  2. HDU 4790 Just Random (2013成都J题)

    Just Random Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

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

    题意:在[a,b]  [c,d] 之间,和模p等于m的对数 详见代码 #include <stdio.h> #include <algorithm> #include < ...

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

    Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game with ...

  5. hdu 4790 Just Random

    思路:对于a<=x<=b,c<=y<=d,满足条件的结果为ans=f(b,d)-f(b,c-1)-f(a-1,d)+f(a-1,c-1). 而函数f(a,b)是计算0<= ...

  6. hdoj 4790 Just Random 【数学】

    题目:hdoj 4790 Just Random 题意:给你两个闭区间[a,b],[c,d],分别从中等可能的跳出 x 和 y ,求(x+y)%p == m的概率 分析: 假如是[3,5] [4,7] ...

  7. HDU 4790:Just Random(容斥)

    Just Random Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

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

    Coach Pang and Uncle Yang both love numbers. Every morning they play a game with number together. In ...

  9. HDU 4336:Card Collector(容斥原理)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=4336 Card Collector Special Judge Problem Descriptio ...

随机推荐

  1. openStack icehouse for centos6.4 production Env 实战

    production Env brief Overview: Management Node:  controller.cc 10.114.100.115 Neutron Network Node:  ...

  2. JQuery DOM HighLighter (it's a basic "Inspect element" simple implementation to mimic what webkit inspector and firebug do)

    JQuery DOM HighLighter (it's a basic "Inspect element" simple implementation to mimic what ...

  3. data pump(数据泵)

    先给出oracle给出的一个定义: “Oracle Data Pump technology enables very high-speed movement of data and metadata ...

  4. C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]

    用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能 ...

  5. Android 实现左右滑动效果ViewFlipper终结【转】

    本示例演示在Android中实现图片左右滑动效果.   关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来 ...

  6. 彻底解决Android因加载多个大图引起的OutOfMemoryError,内存溢出的问题

    最近因为项目里需求是选择或者拍摄多张照片后,提供滑动预览和上传,很多照片是好几MB一张,因为目前的Android系统对运行的程序都有一定的内存限制,一般是16MB或24MB(视平台而定),不做处理直接 ...

  7. JS HTML DOM

    HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. HTML DOM 树 通过 ...

  8. linux搭建邮件服务器

    一.概述: 在配置邮件服务器之前,先解释几个概念. 通常使用Email都很容易,但是Internet的邮件系统是通过几个复杂的部分连接而成的,对于最终用户而言,我们熟悉的Outlook,Foxmail ...

  9. Java RMI 简介及其优劣势总结

    今天,帮别人看UDAS配置问题时,看到采用的是RMI方式的调用,如:rmi://10.20.134.140:2299/DataServer,而且这个端口是被直接硬编码在UDAS的代码中的.既然看到了, ...

  10. Unity 通过NGUI 完成单摄像机 制作地图

    本次思想主要是通过 Ngui的Scroll View 主要是UIPanel的Clipping属性的Alipha Clip 调节窗口大小,遮蔽地图试地图实现在屏幕的部分显示.此方法的好处是不用担心sha ...