lyk在玩一个叫做“打怪兽”的游戏。
游戏的规则是这样的。
lyk一开始会有一个初始的能量值。每次遇到一个怪兽,若lyk的能量值>=怪兽的能量值,那么怪兽将会被打败,lyk的能量值增加1,否则lyk死亡,游戏结束。
若怪兽全部打完,游戏也将会结束。
共有n个怪兽,由于lyk比较弱,它一开始只有0点能量值。
n个怪兽排列随机,也就是说共有n!种可能,lyk想知道结束时它能量值的期望。
由于小数点比较麻烦,所以你只需要输出期望*n!关于1000000007取模后的值就可以了!

 
例如有两个怪兽,能量值分别为{0,1},那么答案为2,因为游戏结束时有两种可能,lyk的能量值分别为0和2。期望为1,1*2!=2,所以答案为2。
Input
  1. 第一行一个数n(1<=n<=100000)。
  2. 接下来一行n个数ai表示怪兽的能量(0<=ai<n)。
Output
  1. 一行表示答案
Input示例
  1. 2
  2. 0 1
Output示例
  1. 2

  1.  
  2. 可以发现一个性质,就是如果我们在第$i$局可以打第$j$个怪,那么在第$i+1$局活着的话可以打第$j$个怪。
    那么我们设$f[i]$表示到第$i$轮还存活着的方案数。
    显然可以递推$\large f[i] = f[i-1] \times \frac{sum[i-1]-i+1}{n-i+1}$.
    $sum[i]$表示能量值小于等于$i$的怪的数量。
    然后答案就是$\large \sum \left(f[i-1]-f[i] \right ) \times \left(i-1 \right)$

  1.  
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7. #define reg register
  8. inline char gc() {
  9. static const int BS = << ;
  10. static unsigned char buf[BS], *st, *ed;
  11. if (st == ed) ed = buf + fread(st = buf, , BS, stdin);
  12. return st == ed ? EOF : *st++;
  13. }
  14. #define gc getchar
  15. inline int read() {
  16. int res = ;char ch=gc();bool fu=;
  17. while(!isdigit(ch))fu|=(ch=='-'),ch=gc();
  18. while(isdigit(ch))res=(res<<)+(res<<)+(ch^),ch=gc();
  19. return fu?-res:res;
  20. }
  21. #define mod 1000000007
  22. #define ll long long
  23. int n;
  24. int sum[];
  25. ll f[];
  26. inline ll ksm(ll x, ll y)
  27. {
  28. ll res = ;
  29. while(y)
  30. {
  31. if (y & ) res = res * x % mod;
  32. x = x * x % mod;
  33. y >>= ;
  34. }
  35. return res;
  36. }
  37. int ans;
  38.  
  39. int main()
  40. {
  41. n = read();
  42. for (reg int i = ; i <= n ; i ++) sum[read()]++;
  43. for (reg int i = ; i <= n ; i ++) sum[i] = sum[i - ] + sum[i];
  44. f[] = ;
  45. for (reg int i = ; i <= n ; i ++) f[] = f[] * i % mod;
  46. for (reg int i = ; i <= n ; i ++)
  47. f[i] = f[i - ] * (sum[i - ] - i + ) % mod * ksm(n - i + , mod - ) % mod;
  48. for (reg int i = ; i <= n ; i ++)
  49. ans = (ans + (f[i - ] - f[i]) * (i - )) % mod;
  50. cout << (ans + f[n] * n) % mod << endl;
  51. return ;
  52. }

[51nod1670] 打怪兽的更多相关文章

  1. 腾讯机试题 AcWing 603 打怪兽

    题目链接:https://www.acwing.com/problem/content/605/ 题目大意: 略 分析: 用dp[i][j]表示用j元钱能在前i只怪兽上所能贿赂到的最大武力值. 有一种 ...

  2. 「题解」小 R 打怪兽 monster

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目描述 小 R 最近在玩一款游戏.在游戏中,小 R 要依次打 \(n\) 个怪兽,他需要打败至少 \(k\) 个怪兽才能通关.小 ...

  3. 51nod-1670-打怪兽(递推/组合数学)

    1670 打怪兽  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 lyk在玩一个叫做“打怪兽”的游戏.游戏的规则是这样的.lyk一开始会有一个初始 ...

  4. 【2020.02.01NOIP普及模拟4】怪兽

    [2020.02.01NOIP普及模拟4]怪兽 文章目录 [2020.02.01NOIP普及模拟4]怪兽 题目描述 输入 输出 输入输出样例 数据范围限制 提示 解析 code 题目描述 PYWBKT ...

  5. Q1微信用户增长11% 微信生态圈逐渐完善

    就在今天早些时候,腾讯公布了Q1财报,微信和手Q游戏收入达18亿元,微信用户环比增长11%,微信生态圈逐渐完善.和xmyanke一起来看看具体的财报数字分析. 微信和手Q游戏付费用户环比增长100%以 ...

  6. 作为一名职高生学习Linux的心酸经历

    当你点进这篇文章的时候,一定会好奇我为什么要用“心酸”这个词,这个词已经太久没被人提起,也许心酸这种感情只能存在于一个人在追中梦想过程中内心角落吧.从小我们总是会被问这样一个问题“你的梦想是什么?”每 ...

  7. 37.看下图实现如下接口和类,并完成Adventure中的主方法。

    //接口Swim package jieKou; public interface ICanswim { void Swim(); } //接口Fly package jieKou; public i ...

  8. 1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖

    1007 正整数分组 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的.   Input 第1行:一个 ...

  9. 胡小兔的OI日志3 完结版

    胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...

随机推荐

  1. sql server 2014 的安装

    1.双击打开sql_server2014的安装包 2.点击弹出来的对话框的确定按钮 3.等待一会,安装包在准备中 4.弹出SQL server 安装中心,点击全新 SQL Server 独立安装 5. ...

  2. mybatis if判断两个值是否相等存在的坑啊

    1.使用“==”比较 字符类型 的值 用“==”比较的使用场景: 不管你用的什么类型的变量,只要变量的值是字符类型就用“==” 产生原因: 在mybatis中如果<if>标签用一个“=”判 ...

  3. 超实用的SQL语句之嵌套查询

    嵌套查询 什么是嵌套查询 . 嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询. ...

  4. python解释器安装和变量配置

    python解释器安装 第一步https://www.python.org/ 下载 python-3.6.6 和 python-2.7.16 俩个版本 Downloads 下 选windows版本 4 ...

  5. [LeetCode] 由 “分形" 所想

    分形思想和递归思想有区别么? 一.简单例子 函数调用自己,简化了理解逻辑,但其他到处都是问题. #%% def listsum(numList): if len(numList) == 1: retu ...

  6. C++基础之顺序容器

    顺序容器简介: 顺序容器类型 描述 vector 可变大小数组,支持快速访问,在尾部之外的地方插入或删除时可能很慢 deque 双端队列.支持快速访问,在头尾插入删除会很快. list 双向列表.只支 ...

  7. [Scala]集合中List元素转Tuple元素的函数迭代写法

    ____ 本文链接: https://www.cnblogs.com/senwren/p/Scala-Lis-2-Tuple.html —— Scala没有提供相应写法, 但迭代写法仍然可以做到. 有 ...

  8. spring后台重定向方式

    1.直接返回值中加重定向:"redirect:要访问的网址"; public String updateOrAddProject() { return "redirect ...

  9. 12-z-index

    z-index 这个东西非常简单,它有四大特性,每个特性你记住了,页面布局就不会出现找不到盒子的情况. z-index 值表示谁压着谁,数值大的压盖住数值小的, 只有定位了的元素,才能有z-index ...

  10. Java 学习笔记之 JVM初识

    JVM初识: java只是启动JVM的命令.JVM真实位置: C:\Program Files\Java\jdk1.8.0_121\jre\bin\server\jvm.dll 1. 第一行JDK版本 ...