[51Nod1850] 抽卡大赛
$solution:$
朴素 $dp$,暴力枚举选择 $i$ 号人的第 $j$ 张卡片,朴素 $dp$ 即可,时间复杂度 $O(n^4)$ 。
考虑对于朴素 $dp$ 的优化,发现其实是一个背包卷积的过程,考虑按 $A$ 值从大到小依次加入,每次维护新的 $P$ 值可以做到 $O(1)$ 。
设计生成函数 $F(x)$ 表示将 $1-n$ 的所有多项式卷在一起的答案,每次只要维护多项式除法与乘法即可,而对于每个多项式都是形如 $ax+b$ 的形式,所以直接暴力维护即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define mod 1000000007
#define int long long
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
struct node{
int val,id,res,p;
}g[MAXN*MAXN];
inline int ksm(int a,int b){
int ans=;
while(b){
if(b&) ans*=a,ans%=mod;
a*=a,a%=mod;
b>>=;
}return ans;
}
int n,tot,F[MAXN],G[MAXN],p[MAXN];
inline void mul(int x1,int x0){
if(!x1) return;
for(int i=;i<=n;i++) G[i]+=F[i]*x0,G[i]%=mod,G[i+]+=F[i]*x1,G[i+]%=mod;
for(int i=;i<=n;i++) F[i]=G[i];memset(G,,sizeof(G));return;
}
int Mod(int x){return ((x%mod)+mod)%mod;}
inline void Div(int x1,int x0){
if(!x1) return;int Inv=ksm(x1,mod-);
for(int i=n-;i>=;i--) G[i]=(Inv*F[i+])%mod,F[i]=Mod(F[i]-x0*G[i]);
for(int i=;i<=n;i++) F[i]=G[i];memset(G,,sizeof(G));return;
return;
}
bool cmp(node x1,node x2){return x1.val>x2.val;}
int P[MAXN],Ans[MAXN],v[MAXN];
signed main(){
// freopen("51nod_1850_11_in.txt","r",stdin);
n=read();int inv100=ksm(,mod-);
for(int i=;i<=n;i++){
int num=read();
int sum=;
int L=++tot,R=;
for(int j=;j<=num;j++){
g[++tot].id=i;
g[tot].val=read(),g[tot].res=((-read())*inv100)%mod,g[tot].p=read();
sum+=g[tot].p;
R=tot;
}
for(int j=L;j<=R;j++) g[j].p=(g[j].p*ksm(sum,mod-))%mod;
}
for(int i=;i<=n;i++) v[i]=read();
F[]=;
sort(g+,g+tot+,cmp);
for(int i=;i<=tot;i++){
int id=g[i].id;
Div(P[id],Mod(-P[id]));
P[id]+=g[i].p,P[id]=Mod(P[id]);P[id]=Mod(P[id]);
for(int k=;k<n;k++) Ans[id]+=Mod(Mod(Mod(F[k]*v[k+])*g[i].res)*g[i].p),Ans[id]=Mod(Ans[id]);
mul(P[id],Mod(-P[id]));
}
for(int i=;i<=n;i++) printf("%d\n",Ans[i]);return ;
}
[51Nod1850] 抽卡大赛的更多相关文章
- 51nod 抽卡大赛
抽卡大赛 链接 分析: $O(n^4)$的做法比较好想,枚举第i个人选第j个,然后背包一下,求出有k个比他大的概率. 优化: 第i个人,选择一张卡片,第j个人选的卡片大于第i个人的概率是$p_j$,那 ...
- 十二省NOI“省选”联考模测(第二场)A抽卡大赛
/* dp维护整体的概率, 每次相当于回退一格然后重新dp一格 */ #include<cstdio> #include<algorithm> #include<iost ...
- 51nod 1850 抽卡大赛 (十二省联考模测) DP
O(n4)O(n^4)O(n4)的DP很好想,但是过不了.来看看O(n3)O(n^3)O(n3)的把. Freopen的博客 CODE #include <cstdio> #include ...
- 三色抽卡游戏 博弈论nim
你的对手太坏了!在每年的年度三色抽卡游戏锦标赛上,你的对手总是能打败你,他的秘诀是什么? 在每局三色抽卡游戏中,有n个卡组,每个卡组里所有卡片的颜色都相同,且颜色只会是红(R).绿(G).蓝(B)中的 ...
- [CSP-S模拟测试]:抽卡(概率DP)
题目描述 水上由岐最近在肝手游,游戏里有一个氪金抽卡的活动.有$n$种卡,每种卡有 3 种颜色.每次抽卡可能什么也抽不到,也可能抽到一张卡.每氪金一次可以连抽 m 次卡,其中前$m−1$次抽到第$i$ ...
- Java实现 蓝桥杯 算法提高 抽卡游戏
试题 算法提高 抽卡游戏 某个抽卡游戏卡池抽出限定卡的概率为p,该游戏有一个"井"的机制,抽满k次卡后直接送这张限定卡.试求获得这张限定卡需要的期望抽卡次数.输入为一行,用空格隔开 ...
- [loj3315]抽卡
令$S$表示对于某一种抽卡顺序中某一段长度为$k$的段全部被抽到的时间(这里没有期望)所构成的集合,根据$min-max$容斥的公式,有$E(\min(S))=\sum_{T\subseteq S}( ...
- 51nod 省选联测 R2
51nod 省选联测 R2 上场的题我到现在一道都没A,等哪天改完了再写题解吧,现在直接写第二场的. 第二场比第一场简单很多(然而这并不妨碍我不会做). A.抽卡大赛:http://www.51nod ...
- C#入门经典第十章例题 - - 卡牌
1.库 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
随机推荐
- 常用深度学习框架(keras,pytorch.cntk,theano)conda 安装--未整理
版本查询 cpu tensorflow conda env list source activate tensorflow python import tensorflow as tf 和 tf.__ ...
- vue学习-day04(路由)
目录: 1.组件传值-父组件向子组件传值和data与props的区别 2.组件传值-子组件通过事件调用向父组件传值 3.案例:发表评论.使用ref获取DOM元素和组件引用 ...
- FastDfs单机版搭建
详细的最新版fastdfs单机版搭建 前言 目前项目是tomcat单机部署的,图片.视频也是上传到tomcat目录下,关键是此项目的主要内容还就是针对图片.视频的,这让我非常担忧:文件服务器的应用是必 ...
- GAN one-shot
基于one-shot的GAN生成图片 GAN的学习资料用于数据增广GAN的调研: https://zhuanlan.zhihu.com/p/32103958 GAN的各种paper汇集(包括Gener ...
- android 对话框显示工具类
这个工具类非常简单,但是将显示dialog的方法统一封装,能够大大减少代码重复 package com.ctbri.weather.utils; import android.app.AlertDia ...
- [LeetCode]-011-Container_With_Most_Water
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- redis的安装及使用总结
Windows版本的安装 下载地址:https://www.jb51.net/softs/541181.html 安装过程 把压缩包内的文件解压到非中文目录即可 启动redis 启动redis要通过命 ...
- 错误1919,配置ODBC数据源MS Access Database时发生错误ODEC错误
WIN7 64位旗舰版安装OFFICE2003 提示:“错误1919,配置ODBC数据源MS Access Database时发生错误ODEC错误” 在64位系统上,32位软件的注册表的信息不是直接在 ...
- 使用collection查询集合属性
介绍resultMap中使用collection查询集合属性 业务需求,查询部门中的多个人员 public class Department { private Integer id; private ...
- 双三次插值C代码(利用opencv)
双三次插值C代码(利用opencv) phasecubic2.cpp D:\文件及下载相关\文档\Visual Studio 2010\Projects\phasecubic2\phasecubic2 ...