51nod 1670-打怪兽(组合数学)
2017-09-08 22:13
274 查看
1670 打怪兽
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
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
Output
Input示例
Output示例
alpq654321 (题目提供者)
C++的运行时限为:1000 ms ,空间限制为:131072 KB 示例及语言说明请按这里
允许其他 AC 的用户查看此代码,分享代码才能查看别人的代码并有机会获得勋章
题解:挺简单的一道题,组合数学的应用,一开始一直wa,后来下载了一组wa的数据发现一种情况没考虑。
即:0 1 2 4 4 答案应该是32,而我是16,好吧,我还以为是方法错了,改了一个地方就AC了。
解法很简单,先求一波前缀和,然后枚举能达到的能力值,然后比该能力值大的利用组合数学的知识求出方案数就好了。
网上的好像都是递推,难道我的不是正解??
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
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
第一行一个数n(1<=n<=100000)。 接下来一行n个数ai表示怪兽的能量(0<=ai<n)。
Output
一行表示答案
Input示例
2 0 1
Output示例
2
alpq654321 (题目提供者)
C++的运行时限为:1000 ms ,空间限制为:131072 KB 示例及语言说明请按这里
允许其他 AC 的用户查看此代码,分享代码才能查看别人的代码并有机会获得勋章
题解:挺简单的一道题,组合数学的应用,一开始一直wa,后来下载了一组wa的数据发现一种情况没考虑。
即:0 1 2 4 4 答案应该是32,而我是16,好吧,我还以为是方法错了,改了一个地方就AC了。
解法很简单,先求一波前缀和,然后枚举能达到的能力值,然后比该能力值大的利用组合数学的知识求出方案数就好了。
网上的好像都是递推,难道我的不是正解??
#include<set> #include<map> #include<stack> #include<queue> #include<vector> #include<string> #include<math.h> #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<algorithm> #include<functional> using namespace std; typedef long long ll; #define inf 1000000000 #define mod 1000000007 #define maxn 101005 #define PI 3.1415926 #define lowbit(x) (x&-x) #define eps 1e-9 ll a[maxn], sum[maxn], ans, b[maxn]; int main(void) { ll n, i, j, p = 1; scanf("%lld", &n); for (i = 1;i <= n;i++) scanf("%lld", &a[i]), sum[a[i]]++; b[0] = 0; b[1] = 1; for (i = 2;i <= n;i++) b[i] = b[i - 1] * i%mod; for (i = 1;i <= n;i++) sum[i] += sum[i - 1]; for (i = 0;i < n;i++) { ll tmp = sum - sum[i + 1]; sum[i] -= i;p *= sum[i];p %= mod; if (sum[i] <= 0) break; if (i != n - 1) ans += (i + 1)*tmp*(b[tmp - 1 + sum[i + 1] - i - 1]) % mod * p%mod; else ans += n*p; ans %= mod; } printf("%lld\n", ans); return 0; }
相关文章推荐
- 51nod 1228 (伯努利数 + 组合数学)
- 51nod 1639 绑鞋带 (组合数学)
- 51NOD 1806 wangyurzee的树(容斥原理 + 组合数学)
- 51nod 1202 子序列个数 (组合数学 +动态规划)
- 51nod 1118 机器人走方格(组合数学)
- 51Nod-1670-打怪兽
- 51nod 瞬间移动 (组合数学)
- 51Nod 1016 水仙花数 V2(组合数学,枚举打表法)
- 51nod 1639绑鞋带(组合数学)
- 51nod 1667 概率好题 组合数学+容斥原理
- 51Nod 1670 打怪兽
- 51nod 序列变换 [容斥原理+莫比乌斯函数]【数论+组合数学】
- 51nod 1667 概率好题 组合数学+容斥原理
- 51nod 1627 瞬间移动【组合数学】
- 51NOD 1639 绑鞋带(组合数学 + 递推)
- 51nod 1120 机器人走方格V3(组合数学+卡特兰数+Lucas)
- 51nod-1670 打怪兽
- 51nod-1670-打怪兽
- 51nod 1670 打怪兽
- 51nod 1119 机器人走方格 V2【组合数学+逆元】