这个题目我只能说我一看就知道是这么做的,但是由于实现能力略水,Wa了3发。

题意为给你两个区间[a,b]和[c,d],两个区间分别任取一个数,现在要你求出这个数模p的值为m的概率有多大。

其实是这么做的,我们需要统计总共有多少种组合情况然后等于就知道分母和分子了。

但是怎么求种类数呢 ???

首先我们定义一个函数count(x,y),表示从0-x,0-y随机取两数满足情况的种类数。

那么最后我们要求的答案ans=count(a,b)-count(a-1,b)-count(a,b-1)+count(a-1,b-1)。

这是容斥原理,到这里问题就转化为了求函数值呢。

但是我们的根本的问题还是没有解决。到底怎么求呢?

我们可以这样考虑,给一个数A,现在问你x%p=m(x不大于A)的种类数有多少?

显然,如果A%p>=m,答案就是A/p+1,如果A%p<m,答案就是A/p。

这里自己算一算就知道了。。。

然后我们等于是由二维优化到了一维,但是还是不够,还有继续优化。

我们知道取模具有周期性,所以我们可以保证最后我们要求其中一个的范围的不会超过p。

假设我们从0开始循环枚举第一个i,那么每次i没增加1,其实就是最终的种类数相当于m减1,如果我们看成p个数对应的函数值,那么我们等于是把每一个函数值右移了一位。

如果你理解了上面,那么恭喜你,可以A掉这个题目了。

具体来说就是这样的,首先不超过A%p的函数值都为A/p+1,超过的部分为A/p。也就是说,只有两种不同的函数值,而且是连续的。

接下来我们等于是每次移动一位,然后求某一固定位置的函数值,这样我们发现移动若干位后的函数值才会变化一次,而且总共最多变化两次(因为循环部分的可以直接计算了),所以找出突变点做一次乘法就可以出答案了。

其实函数移动就是求连续段的函数值啦。。。只是那样好理解一定。

手滑Wa了若干发。。。。OTL。代码也挺挫的,求见谅。

哦,对了,是循环移动。

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std; ll a,b,c,d,n,m,p,ans,t,cas=,G,sum; ll gcd(ll A,ll B) { return B==?A:gcd(B,A%B); } ll count(ll x,ll y)
{
if (x< || y<) return ;
ll tot=,flag=y%p,left=(x+)%p,cur=m,End=(cur-left++p)%p;
ll all=((y%p+)*(y/p+)+(p--y%p)*(y/p));
tot=((x+)/p)*all;
if (left==) return tot;
if (cur<End && End<=flag)
{
tot+=all-(End-cur-)*(y/p+);
return tot;
}
if (cur<End && cur>flag)
{
tot+=all-(End-cur-)*(y/p);
return tot;
}
if (cur<End)
{
tot+=(cur+)*(y/p+)+(p-End)*(y/p);
return tot;
}
if (cur>=End && End>flag)
{
tot+=(cur-End+)*(y/p);
return tot;
}
if (cur>=End && cur<=flag)
{
tot+=(cur-End+)*(y/p+);
return tot;
}
if (cur>End)
{
tot+=(cur-flag)*(y/p)+(flag-End+)*(y/p+);
return tot;
}
return tot;
} int main()
{
scanf("%I64d",&t);
while (t--)
{
scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&p,&m);
ans=count(b,d)-count(a-,d)-count(b,c-)+count(a-,c-);
sum=(b-a+)*(d-c+);
if (ans==)
{
printf("Case #%I64d: 0/1\n",++cas);
continue;
}
G=gcd(ans,sum);
ans/=G,sum/=G;
printf("Case #%I64d: %I64d/%I64d\n",++cas,ans,sum);
}
return ;
}

HDU4790_Just Random的更多相关文章

  1. Chrome V8引擎系列随笔 (1):Math.Random()函数概览

    先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...

  2. Math.random()

    Math.random() 日期时间函数(需要用变量调用):var b = new Date(); //获取当前时间b.getTime() //获取时间戳b.getFullYear() //获取年份b ...

  3. .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    .Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...

  4. 随机数(random)

    需求 Random rd=new Random(); 需要十以内的随机数  (0---10) System.out.println((int)((rd.nextDouble()*100)/10)); ...

  5. python写红包的原理流程包含random,lambda其中的使用和见简单介绍

    Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...

  6. [LeetCode] Random Pick Index 随机拾取序列

    Given an array of integers with possible duplicates, randomly output the index of a given target num ...

  7. [LeetCode] Linked List Random Node 链表随机节点

    Given a singly linked list, return a random node's value from the linked list. Each node must have t ...

  8. [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表

    A linked list is given such that each node contains an additional random pointer which could point t ...

  9. php对应js math.random

    <?php function random($min = 0, $max = 1) {     return $min + mt_rand()/mt_getrandmax()*($max-$mi ...

随机推荐

  1. 2016-2017-2 20155339《 java面向对象程序设计》实验四Android程序设计

    2016-2017-2 20155339< java面向对象程序设计>实验四Android程序设计 实验内容 1.Android Stuidio的安装测试: 参考<Java和Andr ...

  2. 百度地图Map属性和方法

    map的L属性:TANGRAM__1 map的F属性:[object Object] map的xa属性:[object HTMLDivElement] map的width属性:1340 map的hei ...

  3. 【SDOI2014】数表

    题面 题解 不管$a$的限制 我们要求的东西是:($\sigma(x)$是$x$的约数个数和) $ \sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j)) $ 设$f(x)= ...

  4. 【洛谷P2245】星际导航

    题面 题解 \(kruskal\)重构树板子题??(大雾 因为重构树上两点之间的\(LCA\)的权值就是原图上最小生成树上的瓶颈. 所以建个重构树,跑\(LCA\)即可. 代码 #include< ...

  5. rem布局注意问题和meta标签

    使用rem前的准备: 如果是移动端,添加name="viewport"的meta标签,其中的属性数值根据实际需求而定: <meta name="viewport&q ...

  6. 【Unity3d】MenuItem修饰的方法无法触发的可能原因

    遇到了MenuItem修饰的方法无法触发的情况,顺利解决. 类放在Editor目录下,该类下其他方法被MenuItem修饰可以触发. 后来发现我修饰的方法和该类下另一个方法重名了. 改方法名,问题解决 ...

  7. 使用 AFNetworking做过断点续传吗?

    断点续传的主要思路: 检查服务器文件信息 检查本地文件 如果比服务器文件小, 断点续传, 利用 HTTP 请求头的 content-range实现断点续传(如果content-range不存在就取Co ...

  8. Consul 架构(译)

    Consul 架构 此篇文章主要对consul的相关内部技术细节进行简要概述. »术语 代理 - 代理是指consul集群中运行的consul实例,通过执行 consul agent 命令来启动. 代 ...

  9. openstack系列文章(三)

    学习openstack的系列文章-glance glance 基本概念 glance 架构 openstack CLI Troubleshooting 1. glance 基本概念 在 opensta ...

  10. docker应用容器化准则—12 factor

    在云的时代,越来越多的传统应用需要迁移到云环境下,新应用也要求能适应云的架构设计和开发模式.而12-factor提供了一套标准的云原生应用开发的最佳原则. 在容器云项目中应用容器化主要参考12-Fac ...