# T749 localmaxima

权限限制没有超链接

题目描述 Description

给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmaxima数的个数的期望。

输入输出格式 Input/output

输入格式:
一个数n,表示排列为1-n的一个随机排列。
输出格式:
一个浮点数表示localmaxima数的个数期望。四舍五入保留8位小数。

输入输出样例 Sample input/output

样例测试点#1
输入样例:

2

输出样例:

1.50000000

说明 description

1,2的排列共两种:1,2和2,1.共3个localmaxima数。期望为3/2=1.5.

对30%数据n<=10.
对80%数据n<=1000000.
对100%数据n<=2^31-1

个人解法:

深深被数论的魅力所折服。
要非常非常感谢锟哥的帮助与学长的启发。
首先初看此题,全然没有思路。本来想是暴力table的了,但是很悲哀的是每一个n都会有全然不同的的答案,枚举?丝毫不可能成立……恐怕打表也只是等上几个小时的折腾了。
那么怎么办呢?
这个时候锟哥给了我启示。
既然我们是求期望嘛,就可以从每一个数开始入手。
这一题的数学期望就是
把每一个数成为localmaxima的情况加起来,再除以所有情况数。
至于所有的情况数,很简单,就是An取n,也就是n!。
于是我就开始着手于某一个数成为localmaxima的所有可能数。
先考虑了最简单的1。
1可能成为localmaxima的情况有多少种呢?
我们知道,在一个全排列中,没有比1小的。那么1只有放在第一位的时候可能成为localmaxima。那么这一共有多少种情况呢?很简单,就是A(n-1)取n-1,即$(n-1)!$。
那2呢?
我们发现,比2小的只有1。所以我们可以分两种情况:
第一种情况,2放在第一位,有(n-1)!种可能。
第二种情况,2放在第二位,因为2之前的数只可能是1才会让2成为localmaxima,所以有(n-2)!种可能。
如果2摆在第三位及以后,就必定会有一个比2大的数在2的前面,所以2就不再是localmaxima了,所以我们发现,对于一个数i,只需要考虑i放在第1至i位。
所以2成为localmaxima的可能一共有$(n-1)!+(n-2)!$种。
接下来考虑3。
比3小的有两个数,1和2。
那么我们就分三种情况讨论。
第一种情况,当然是3放在第一位,共$(n-1)!$种。
第二种情况,3放在第二位,这个时候比3小的有两个,1和2,所以就是A^{1}_{2}*(n-2)!种。
第三种情况,3放在第三位,这个时候3之前的排列共有$A^{2}_{2}$种,3之后的排列共有$(n-3)!$种,所以就是$A^{2}_{2}*(n-3)!$种。
所以综合起来,就是$(n-1)!+A^{1}_{2}*(n-2)!+A^{2}_{2}*(n-3)!$。
诶,这个时候整理一下,我们就来规律了。
对于一个数i,它成为localmaxima的所有情况数应该是:
$A^{0}_{i-1}*(n-1)!+A^{1}_{i-1}*(n-2)!+A^{2}_{i-1}*(n-3)!+……+A^{i-1}_{i-1}*(n-i)!$
这个公式的意义是什么呢?就是考虑i在1至i的每一个位置j时,它前面的排列有A(j-1取i-1)种,后面的排列有A(n-j取n-j)种(也就是(n-j)!种)。所以就是1至i的累加和(那个符号不会打……)了。
于是我就试了几组数据。
首先是n,表示全排列的长度。
接下来n行。第i行的数表示i成为localmaxima的所有情况数:
n=5时

n=10时

n=20时

似乎并没有什么规律的样子。
后来想到要求的期望,每一个数变为local数的情况除以所有情况(n!)再加起来就是期望了。所以便想到把每一项求出来。
神奇的事就这样发生了。
我又试了几组数据。
首先是一个n,意义同上。
接下来n行。第i行的数字表示第i个数成为localmaxima的情况数除以n!(也就是全排列的总个数)的值。
n=5时

n=10时

n=20时

我想规律就显而易见了吧。
所以
$ans=1/1+1/2+1/3+……+1/n$
所以就这样把公式推导出来了。
接下来我就兴奋地把程序打了下来,本满以为可以AC,结果却发现测试点9和10都超时了,这个时候我才发现,$n<=2^{31}-1$。
那么怎么办?
这个时候就是学长给了我启发。
这个数学界都还没有解决彻底的问题呢……
对于大数据for的话是肯定超时了,不过我们还是可以肯定在80分的点用for还是可以过的,毕竟只有1000000。
那对于那么大的数嘛……
既然只需要精确到8为小数,我们就可以尝试一下调和级数了。
至于怎么用嘛……这里面很清楚http://baike.baidu.com/link?url=06w5WhIAzAi8FjOxV4WotFCikPRKmqMKAyGW-2wq-ToakcdLBxcl3XwNCvpBGaCwASC_5NQsV6gAEP-ncR9vTK
简单地说,就是1/1+1/2+1/3+1/4+……1/n=ln(n+1)+r,其中r是一个常数,好像叫欧拉常数吧。
很可惜的是,我们目前对于这个常数了解甚少……包括我们并不知道r到底是无理数还是有理数……
所以很明显了,对于前80分时不能用调和级数的,因为精度要求高,调和级数只是用于AC大数据的了(这在上面的论文中也有提及的样子)。
说了半天,代码只有13行,只是知识倒是精华了呢。
代码如下:

#include<cstdio>
#include<cmath>
#include<iostream>
#define re register int
using namespace std;
const double r=0.5772156649;
int n,i;
double vk;
int main(){
freopen("T749.in","r",stdin);
freopen("T749.out","w",stdout);
scanf("%d",&n);
if(n<=1000000) for(double i=1;i<=n;++i) {
vk=vk+1/i;
// cout<<vk<<endl;
}
else vk=log(n+1)+r;
// cout<<log(n+1)+r<<endl;
printf("%0.8lf",vk);
return 0;
}

原文地址:http://liaoy148.lofter.com/post/1da8a74e_a3d612e

【题解】localmaxima 数论的更多相关文章

  1. POJ 1845-Sumdiv 题解(数论,约数和公式,逆元,高中数学)

    题目描述 给定A,B,求A^B的所有因数的和,再MOD 9901 输入 一行两个整数 A 和 B. 输出 一行,一个整数 样例输入 2 3 样例输出 15 提示 对于100%的数据满足:0 <= ...

  2. UVA571Jugs题解--简单数论(其实是瞎搞)

    题目链接 https://cn.vjudge.net/problem/UVA-571 分析 刚做了道倒水问题的题想看看能不能水二倍经验,结果发现了这道题 题意翻译:https://www.cnblog ...

  3. Codeforces 515C 题解(贪心+数论)(思维题)

    题面 传送门:http://codeforces.com/problemset/problem/515/C Drazil is playing a math game with Varda. Let’ ...

  4. luoguP1082 同余方程 题解(NOIP2012)(数论)

    luoguP1082 同余方程 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...

  5. 【BZOJ4173】数学 题解(数论)

    前言:体验到了推式子的快感orz 题目大意:求$\varphi(n)*\varphi(m)*\sum_{n\ mod\ k+m\ mod\ k\geq k} \varphi(k)\ mod\ 9982 ...

  6. 2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)

    Problem A: 回文 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1719  Solved: 528 Description 小王想知道一个字 ...

  7. Bzoj 3505: [Cqoi2014]数三角形 数论

    3505: [Cqoi2014]数三角形 Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits   Description

  8. Tsinsen A1504. Book(王迪) 数论,贪心

    题目:http://www.tsinsen.com/A1504 A1504. Book(王迪) 时间限制:1.0s   内存限制:256.0MB   Special Judge 总提交次数:359   ...

  9. 「POJ3696」The Luckiest number【数论,欧拉函数】

    # 题解 一道数论欧拉函数和欧拉定理的入门好题. 虽然我提交的时候POJ炸掉了,但是在hdu里面A掉了,应该是一样的吧. 首先我们需要求的这个数一定可以表示成\(\frac{(10^x-1)}{9}\ ...

随机推荐

  1. c++中new[ ]与delete[ ]的分析

    前言 以前对c++的new[]的了解就是开辟一块内存,直到我最近在程序中用到它才发现我的了解太浅. 问题分析 new[]得到的内存空间不会自动初始化 new[]是在堆区中动态分配指定大小的内存,但是这 ...

  2. centos 7.6 安装最新版docker 19.03

    systemctl stop docker rpm -qa | grep docker 看到那个删除那个yum erase docker \ docker-client \ docker-client ...

  3. JS数组的操作方法汇总

    数组的增删 push():添加到最后 pop():取出最后一个 shift():取出第一个 unshift():添加到第一个 splice() : 返回删除的数组,如果没有则为空数组,会改变原数组.可 ...

  4. SprintBoot使用Validation

    1.为什么要使用Validation 在开发过程中有没有使用一堆的if来判断字段是否为空.电话号码是否正确.某个输入是否符合长度等对字段的判断.这样的代码可读性差,而且还不美观,那么使用Validat ...

  5. JMM——Java内存模型抽象|八种同步操作|操作规则

    JMM 调用栈&本地变量在线程栈上 对象整体在堆上(包括其本地变量,不论类型),栈有其引用即可访问, 线程调用同一个对象时,是访问该对象的私有拷贝 每个CPU有自己的高速缓存 高速缓存存在意义 ...

  6. 交互-通过axios拦截器添加token认证

    通过axios拦截器添加token认证 一.通过axios请求拦截器添加token,保证拥有获取数据的权限 通常访问接口需要相关权限,通常是需要携带token如下所示 那如何在请求头中添加token? ...

  7. systemctl服务------字符和图像界面切换systemctl set-default multi-user.target systemctl isolate multi-user.target #当前立即进入字符模式 [root@room4pc09 桌面]# systemctl isolate graphical.target #当前立即进入图形模式

    查看服务运行状态 [root@room4pc09 桌面]# systemctl status crond #查看服务运行状态 ● crond.service - Command Scheduler L ...

  8. XSF /如何使用xrandr

    XSF /如何使用xrandr 西里尔·布鲁莱布瓦<kibi@debian.org> 目录 入门 什么是xrandr? xrandr是与XRandR 扩展名交互的命令行工具[请参阅x.or ...

  9. SPEC 2000 整形和浮点性能测试结果是各项基准程序得分的几何平均值,几何平均值是 n 个数连乘之 后再开 n 次根号

    SPEC 2000 能够生成多种格式的测试结果报表,包括 asc,ps,raw,pdf,html 等格式,报 表所在目录为/home/sepc2000­all/result. 整形和浮点性能测试结果是 ...

  10. 马哥Linux SysAdmin学习笔记(一)

    Linux入门 Linux系统管理: 磁盘管理,文件系统管理 RAID基础原理,LVM2 网络管理:TCP/IP协议,Linux网络属性配置 程序包管理:rpm,yum 进程管理:htop,glanc ...