这个题目我只能说我一看就知道是这么做的,但是由于实现能力略水,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. 20155226-虚拟机与Linux之初体验

    虚拟机与Linux之初体验 虚拟机的安装 虚拟机对我来说不是很了解,但今天在安装过程中加深了我的理解.虚拟机是一个在原来系统基础上进行的又一个系统安装,可以在不影响前者的情况下完成一些其不能解决的问题 ...

  2. kali更新源相关 -- 没有release文件、签名无效、404

    kali更新源相关 -- 没有release文件.签名无效.404 这个随笔主要是处理Mac下使用VMare虚拟机安装Kali时候我遇到的一些关于更新源的问题 (因为本人为了这个问题折腾了四五个小时, ...

  3. 2017-2018-1 20155323《信息安全技术》实验二 Windows口令破解

    2017-2018-1 20155323<信息安全技术>实验二 Windows口令破解 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破解 系统环 ...

  4. removeAttribute与removeAttributeNode的区别

    1.removeAttributeNode() 方法删除指定的属性,并以 Attr Node 对象返回被删除的属性. 例: <!DOCTYPE html><html><b ...

  5. Wcf服务测试自带工具

    Visual Studio 安装包文件夹 \Common7\IDE\WcfTestClient.exe

  6. [agc006F]Blackout

    Description 传送门 Solution 这道题的操作是真的得服气..感谢各位大佬的指导. 首先我们看看答案的最大值:1010.哦不,这不可能存在,我们肯定不可能一轮轮枚举点进行扩展的. 所以 ...

  7. 深入理解C++中的Const,Mutable以及Volatile

    我一直认为const表示一个常量,常量就是一个无法被修改的值,但是没有深入理解const的实现,甚至不知道mutable和volatile的存在,最近在书中看到了这一部分的知识,所以本文将详细解析这几 ...

  8. 怎样安装TortoiseGit

    TortoiseGit是基于Windows的Git图形化工具 访问 https://tortoisegit.org/

  9. clean code(一)

    代码整洁之道对于程序的重构及可读性至关重要.开始整洁之道吧!!! 一.抽离try catch 模块 public void delete(Page page){ try { deletePageAnd ...

  10. HTTP结构讲解——《HTTP权威指南》系列

    HTTP结构 第二部分的5章主要介绍了HTTP服务器,代理,缓存,网关和机器人应用程序,这些都是Web系统架构的构造模块. Web服务器 第五章 Web服务器会对HTTP请求进行处理并提供响应.术语& ...