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。
然后是处理边界的问题,首先x或y处于边界的数的数量一定不超过p-1个,设分别有x2,y2个,这x2。y2个数一定能在相应的每一个循环中找到相应的成功组合。所以还要多出x2*y1+y2*x1个成功组合数。
最后还要在这x2,y2个数里找到互相相应的数。由于要求x2+y2 ≡ m(mod p),所以(m-x2) ≡ y2(mod p),然后找到它们重叠的部分就可以。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
#include <ctype.h>
#include <algorithm>
#include <string>
#include <set>
#define PI acos(-1.0)
#define maxn 10005
#define INF 0x7fffffff
#define eps 1e-8
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
int main()
{
int T;
scanf("%d",&T);
for(int ii=1; ii<=T; ii++)
{
LL a,b,c,d,p,m;
scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&p,&m);
LL x=b-a+1,y=d-c+1;
LL xx=(b-a+1)/p;
LL yy=(d-c+1)/p;
LL xxx=x-xx*p;
LL yyy=y-yy*p;
LL t=xx*yy*p;
LL fm=x*y;
t+=xxx*yy;
t+=yyy*xx;
if(xxx!=0&&yyy!=0)
{
LL head=a%p;
LL tail=b%p;
LL head1=((m-tail)%p+p)%p;
LL tail1=((m-head)%p+p)%p;
LL head2=c%p;
LL tail2=d%p;
//cout<<head1<<" "<<tail1<<" "<<head2<<" "<<tail2<<endl;
if(tail1>=head1&&tail2>=head2)
t+=(max(0LL,(min(tail2,tail1)-max(head1,head2))+1));
else if(tail1>=head1&&tail2<head2)
{
if(tail1<=tail2)
t+=max(0LL,tail1-head1+1);
else if(tail1>tail2&&tail1<head2)
t+=max(0LL,tail2-head1+1);
else t+=max(0LL,tail1-max(head1,head2)+1)+max(0LL,tail2-head1+1);
}
else if(tail2>=head2&&tail1<head1)
{
if(tail2<=tail1)
t+=max(0LL,tail2-head2+1);
else if(tail2>tail1&&tail2<head1)
t+=max(0LL,tail1-head2+1);
else t+=max(0LL,tail2-max(head1,head2)+1)+max(0LL,tail1-head2+1);
}
else t+=(p-max(head1,head2)+min(tail1,tail2)+1+max(0LL,tail1-head2+1)+max(0LL,tail2-head1+1));
}
printf("Case #%d: ",ii);
if(t==0)
printf("0/1\n");
else
{
LL ttt=__gcd(t,fm);
printf("%I64d/%I64d\n",t/ttt,fm/ttt);
}
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
HDU 4790 Just Random 数学的更多相关文章
- hdu 4790 Just Random (2013成都J题) 数学思路题 容斥
题意:在[a,b] [c,d] 之间,和模p等于m的对数 详见代码 #include <stdio.h> #include <algorithm> #include < ...
- hdu 4790 Just Random (思路+分类计算+数学)
Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game with ...
- HDU 4790 Just Random (2013成都J题)
Just Random Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4790 Just Random 神奇的容斥原理
/** 大意: 给定[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); ...
- 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<= ...
- hdoj 4790 Just Random 【数学】
题目:hdoj 4790 Just Random 题意:给你两个闭区间[a,b],[c,d],分别从中等可能的跳出 x 和 y ,求(x+y)%p == m的概率 分析: 假如是[3,5] [4,7] ...
- HDU 4790:Just Random(容斥)
Just Random Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- Just Random HDU - 4790 思维题(打表找规律)分段求解
Coach Pang and Uncle Yang both love numbers. Every morning they play a game with number together. In ...
- hdu 4790 数学
/* 题意:给你二个区间[a,b]和[c,d] 分别从中选一个数x和y使的(x+y)%p=m; 可以这样来求,先求出(0->b和0->d区间段的值)-(区间0->a-1和0-> ...
随机推荐
- iOS学习——ViewController(六)
ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁,ViewController管理应用中的众多视图. iOS的SDK中提供很多原生ViewControlle ...
- 《Swift编程语言》中文翻译及读书笔记page25
The Swift Programming Language读书笔记学习笔记 第25页 本页主要说在swift语言里能够使用分号,但分号不作为每条swift语言语句的结尾 而是间隔写在一行的多条swi ...
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...
- IOS 轻量级数据持久化 DataLite
开发的过程中我们经常要保存一些配置信息,一般简单的是用 NSUserDefaults [[NSUserDefaults standardUserDefaults] objectForKey:key]; ...
- Valera and Tubes
C. Valera and Tubes time limit per test 1 second memory limit per test 256 megabytes input standard ...
- DFA最小化 -- Hopcroft算法 Python实现
wiki 伪代码看上去一直以为怪.发现葡萄牙语和俄罗斯语那里的 if 推断都还缺少一个条件. 国内的资料比較少.这几份学习资料不错.比我稀里糊涂的思路要好,分享下: http://www.liafa. ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(四)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...
- script:查看历史sql执行信息
script:查看历史sql执行信息 SELECT * FROM (SELECT '1.v$sql'||'实例号:'||GV$SQL.inst_id source, ...
- 在gfs2中关闭selinux
在构建iSCSI存储集群时,请勿在gfs2中使用selinux
- Swift - 各种手势检测大全(UIGestureRecognizer及其子类)
UIGestureRecognizer有许多子类,用于监听一些常见的手势事件,这些子类主要有: 1,UISwipeGestureRecognizer:滑动(快速移动) 1 2 3 4 5 6 7 8 ...