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 ...
随机推荐
- 安装虚拟机和Linux系统的学习
安装虚拟机和Linux系统的学习(随笔3) 1.安装虚拟机 首先我按着老师给的链接上的步骤一步一步安装VirtualBox,进行得十分顺利. 接着则是在虚拟机上安装Ubuntu. 然而安装完成以后按要 ...
- 实验一 Java开发环境的熟悉(Linux+Eclipse)
实验一 Java开发环境的熟悉(Linux+Eclipse) 在Linux或Window或macOS中命令行下运行Java 在Linux 或Window或 macOS环境中 IDEA中调试设置断点 实 ...
- C# JSON和对象之间互相转换
1.首先是声明用户信息对象,DataContract修饰类,表示可以被解析成JSON,DataMember修饰属性,Order表示 解析的顺序,另外Lover是数组列表,表示女朋友个数 Address ...
- 人脸识别引擎SeetaFaceEngine中Alignment模块使用的测试代码
人脸识别引擎SeetaFaceEngine中Alignment模块用于检测人脸关键点,包括5个点,两个眼的中心.鼻尖.两个嘴角,以下是测试代码: int test_alignment() { std: ...
- MySQL入门篇(四)之MySQL主从复制
一.MySQL主从复制原理 随机站点访问量的鞥集啊,单台的MySQL服务器压力也不断地增加,此时需要对MySQL进行优化,如果在MySQL优化无明显改善时期,可以使用高可用.主从复制.读写分离.分库分 ...
- bootstrap 4 panels已被card替换
https://www.zhihu.com/question/34838389?sort=created 解决问题的思路不对,不应该搜不到就各种着急,应该理清思路, 既然 bootstrap4没有了3 ...
- kettle 将job等导入导出成xml
一.导出 工具->资源库->探索资源库 就可以看见资源库里面的资源了. 如果要导出资源库里面的某个目录就右键就行了. 如果要导出全部资源库的文件就如下图所示 将资源库导出其实也是一个xml ...
- 【转】ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.165' (113)
原文转自:http://blog.csdn.net/chengyuqiang/article/details/54285857 1.程序报错: com.mysql.jdbc.exceptions.jd ...
- jenkins 入门教程
jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...
- JY播放器【QQ音乐破解下载】
今天给大家带来一款神器----JY播放器.可以直接下载QQ音乐的歌曲. 目前已经支持平台(蜻蜓FM.喜马拉雅FM.网易云音乐.QQ音乐) 使用方法: 在网页打开QQ音乐网站找到你要听的歌曲或歌单.复制 ...