【HDOJ 5419】 Victor and Toys (排列组合)
2024-08-23 05:24:44
n个玩具 m个区间
每一个玩具有一个beauty值 问任选三个区间 三区间的MINleft~MAXright的和的期望值
预处理一个数组 存放每一个位置被几个区间囊括 这样该位置被选择的概率为c(x,3)/c(m,3)
若beauty数组为w 预处理数组a
期望值即为 w[i]*c(a[i],3)/c(m,3) i∈[1,n]
注意防止乘法爆long long
代码例如以下:
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long using namespace std; int w[50001];
int ad[50002]; ll C(ll n)//c(n,3)
{
if(n < 3) return 0;
ll ans = 1;
for(int i = 2; i >= 0; --i)//防爆long long
ans = ans*(n-i)/(3-i); return ans;
} ll gcd(ll a,ll b)//约分
{
ll tmp;
while(b)
{
tmp = b;
b = a%b;
a = tmp;
}
return a;
} int main()
{
int t,n,m,i,l,r;
ll fz,fm,gd,lst; scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
for(i = 1; i <= n; ++i)
scanf("%d",&w[i]);
memset(ad,0,sizeof(ad));
for(i = 0; i < m; ++i)
{
scanf("%d %d",&l,&r);
ad[l]++;
ad[r+1]--;
}
if(m < 3)//不这样做会越界。 。血的教训
{
puts("0");
continue;
} fm = C(m); fz = lst = 0;
for(i = 1; i <= n; ++i)//预处理被选次数顺带把期望求了。。
{
lst += ad[i];
fz += w[i]*C(lst);
} gd = gcd(fz,fm);
fz /= gd;
fm /= gd;
if(fm == 1) printf("%I64d\n",fz);
else printf("%I64d/%I64d\n",fz,fm);
} return 0;
}
最新文章
- Linux学习之让进程在后台可靠运行的方法详解
- Chrome开发者工具详解
- [转]MongoDB学习 C#驱动操作MongoDB
- mq_send
- CSS入门学习(转)
- 【Eclipse】代码格式化 快捷键无效
- QQ群友在线/离线,如何测试?
- Android ui 透明度设置
- IP欺骗
- python-支付宝支付示例
- Django_创建项目
- Linux学习笔记:【004】Linux内核代码风格
- python3+selenium入门07-元素等待
- HttpWebRequest 高效并发问题
- mysql 查看正在执行的语句
- 雷林鹏分享:jQuery EasyUI 窗口 - 自定义窗口工具栏
- Markdown中怎么上传图片
- R绘图 第八篇:绘制饼图(ggplot2)
- Celery最佳实践(转)
- MySQL高级函数case的使用技巧----与sum结合实现分段统计
热门文章
- Linq学习(零)-错误汇总
- 记Spring下autowire为name时的一个现象
- linux设置库文件加载包含路径
- Singleton.java.ft not found 相关错误的解决办法
- Recyclerview点击事件,更新item的UI+更新Recyclerview外的控件
- [Windows Server 2012] Tomcat安全加固方法
- 【译】x86程序员手册08 -2.6中断和异常
- url取值乱码问题,url加中文导致页面不能加载问题 js unicode转码,以及解码
- $.extend 合并对象(处理可传入0个或多个参数)
- CAD得到自定义实体拖放夹点(com接口VB语言)