HDU4790_Just Random
这个题目我只能说我一看就知道是这么做的,但是由于实现能力略水,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的更多相关文章
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...
- Math.random()
Math.random() 日期时间函数(需要用变量调用):var b = new Date(); //获取当前时间b.getTime() //获取时间戳b.getFullYear() //获取年份b ...
- .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
.Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...
- 随机数(random)
需求 Random rd=new Random(); 需要十以内的随机数 (0---10) System.out.println((int)((rd.nextDouble()*100)/10)); ...
- python写红包的原理流程包含random,lambda其中的使用和见简单介绍
Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...
- [LeetCode] Random Pick Index 随机拾取序列
Given an array of integers with possible duplicates, randomly output the index of a given target num ...
- [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 ...
- [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
A linked list is given such that each node contains an additional random pointer which could point t ...
- php对应js math.random
<?php function random($min = 0, $max = 1) { return $min + mt_rand()/mt_getrandmax()*($max-$mi ...
随机推荐
- 20155307《Java程序设计》实验二实验报告
一.单元测试和TDD 用程序解决问题时,要学会写以下三种代码: 伪代码 产品代码 测试代码 正确的顺序应为:伪代码(思路)→ 测试代码(产品预期功能)→ 产品代码(实现预期功能),这种开发方法叫&qu ...
- 20155321 2016-2017-2 《Java程序设计》第十周学习总结
20155321 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络概览 局域网和广域网:局域网通常限定在一个有效的地理区域之内,广域网由许多局域网组成.最 ...
- 20155325 2016-2017-2 《Java程序设计》第1周学习总结
教材学习内容总结 三大平台 java SE:JVM(java虚拟机),JRE(运行java程序),JDK(包括JRE及开发过程中需要的一些工具程序),java语言. java EE:基于java SE ...
- 20155339《java程序设计》第一次实验报告
20155339<java程序设计>第一次实验报告 实验一 java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的java程序: 2.使用IDEA编辑.编译.运行.调试java程 ...
- apt-get 0%
错误如下: www.2cto.com 使用apt-get命令安装软件时出现“0%[正在等待报头]“的提示且无法继续安装,一般出现此问题是因为安装过程中Ctrl+C强行中断或其它原因导致上 ...
- PHP学习笔记之析构函数以及static,self,parent关键字
引用 $jordan1 = &$jordan; 当jordan1 = null; //此时会直接调用析构函数 而当无&时,就需要等到所有的引用都为null时,才调用析构函数析构 乔丹 ...
- 微信小程序点击按钮,修改状态
WXML中: <view wx:if="{{orderstate}} = '待送检' " data-no="{{orderstate}}" bindtap ...
- 【LG3234】[HNOI2014]抄卡组
题面 题解 分三种情况: 若所有串都没有通配符,直接哈希比较即可. 若所有串都有通配符, 把无通配符的前缀 和 无通配符的后缀哈希后比较即可. 中间部分由于通配符的存在,一定可以使所有串匹配. 若部分 ...
- redis sentinel介绍
目录 配置redis主从复制 使用ping命令检查是否启动 主节点查看链接信息 开始部署sentinel 节点 部署sentinel 启动sentinel 演示下故障转移 查看当前sentinel监控 ...
- Python基础灬序列(字符串、列表、元组)
序列 序列是指它的成员都是有序排列,并且可以通过下标偏移量访问到它的一个或几个成员.序列包含字符串.列表.元组. 字符串 chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪' print(c ...