猪国杀


题解

为什么总有**出题人喜欢用一些毒瘤题的题目名字来命名题目呀。

看到这种题一般很容易想到通过 d p dp dp来进行转移吧。
我们先考虑一下如果我们要选牌的话怎么选才能让我们获得的牌尽量多,显然是从小的选起会让我们的牌的总数尽可能的大。
为了避免枚举牌的去重容斥操作,我们可以考虑确定我们选牌的顺序,就是选较小的牌,根据每一种选牌的方案确定我们整个牌的序列。
我们可以就将牌按照从小到大的顺序加入,构造我们所选择牌的序列。
我们定义 d p i , j dp_{i,j} dpi,j​表示选择了 i i i张牌,总和为 j j j的方案数。
转移十分显然,如果我们已经选择加入到权值为 x x x的牌,枚举其加入的张数 k k k,
d p i + k , j + k x + = ( i + k i ) d p i , j dp_{i+k,j+kx}+=\binom{i+k}{i}dp_{i,j} dpi+k,j+kx​+=(ii+k​)dpi,j​
当然,如果加上我们选择的卡,它的总和已经大于 m m m了,相当于它的选择卡的序列已经固定下来了,我们可以将这种情况加入答案。
但要注意,最后加入的卡可能会有多张,但我们只会从中选择部分,但还是得枚举选择了多少张。
我们记 t = ⌊ m − j x ⌋ t=\left\lfloor\frac{m-j}{x}\right\rfloor t=⌊xm−j​⌋,显然,我们最后选择的卡牌只会有 t t t张加入答案,那么计算 d p i , j dp_{i,j} dpi,j​的贡献时我们可以枚举选择的卡牌张数,
A n s + = ∑ k = t + 1 n − i ( i + t ) ( n i ) ( n − i k ) ( A − x ) n − i − k d p i , j A n Ans+=\frac{\sum_{k=t+1}^{n-i}(i+t)\binom{n}{i}\binom{n-i}{k}(A-x)^{n-i-k}dp_{i,j}}{A^n} Ans+=An∑k=t+1n−i​(i+t)(in​)(kn−i​)(A−x)n−i−kdpi,j​​
显然,除了我们枚举的选择权值 x x x的位置,其它的位置权值都比 x x x大,所以有 ( A − x ) (A-x) (A−x)种选择。
所以我们对于 d p i , j dp_{i,j} dpi,j​的转移是在 k ⩽ t k\leqslant t k⩽t时转移到 d p i + k , j + k x dp_{i+k,j+kx} dpi+k,j+kx​,当 k > t k>t k>t时贡献到答案。
这样的话时间复杂度是 O ( n 2 m A ) O\left(n^2mA\right) O(n2mA),考虑优化。

显然,可以发现,我们贡献到答案的部分 d p i , j dp_{i,j} dpi,j​的系数 ( i + t ) ( n i ) ( n − i k ) ( A − x ) n − i − k (i+t)\binom{n}{i}\binom{n-i}{k}(A-x)^{n-i-k} (i+t)(in​)(kn−i​)(A−x)n−i−k其实可以被拆成两段来看, ( i + t ) (i+t) (i+t),对于每个 j j j是独立的,可以在枚举到 j j j时 O ( 1 ) O\left(1\right) O(1)算出。 ( n i ) ( n − i k ) ( A − x ) n − i − k \binom{n}{i}\binom{n-i}{k}(A-x)^{n-i-k} (in​)(kn−i​)(A−x)n−i−k只与 i i i和 k k k相关。
我们完全可以对于第二部分在枚举 i i i时就将其前缀和算出,枚举 j j j时得到 t t t就可以差分出这段的和。
所以我们贡献到答案的部分实际上是可以 O ( 1 ) O\left(1\right) O(1)求出的。
而贡献到 d p dp dp的部分对于每个 d p i , j dp_{i,j} dpi,j​是 O ( t ) O\left(t\right) O(t)的。
由于 t t t是从 1 1 1枚举到 m m m的,显然是一个调和级数的形式,所以每个 d p i , j dp_{i,j} dpi,j​会贡献 A ln ⁡ m − j A\ln m-j Alnm−j次。

总时间复杂度 O ( n m A ln ⁡ m ) O\left(nmA\ln m\right) O(nmAlnm),卡卡常就过了。

源码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
#define debug(x) cerr<<#x<<"="<<x<<'\n'
typedef long long LL;
typedef unsigned long long uLL;
const LL INF=0x3f3f3f3f3f3f3f3f;
const int mo=998244353;
const int inv2=499122177;
const int jzm=2333;
const int n1=50;
const int zero=10000;
const int orG=3,invG=332748118;
const double Pi=acos(-1.0);
const double eps=1e-5;
typedef pair<LL,int> pii;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){putchar('\n');while(x>9){putchar((x%10)|'0');x/=10;}putchar(x|'0');}
LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1LL)t=1ll*a*t%p;a=1ll*a*a%p;s>>=1LL;}return t;}
int n,m,A,dp[2][105][MAXN],ans,fac[MAXN],inv[MAXN],f[MAXN],pw[105][MAXN],C[105][105],sum[1005];
void init(){fac[0]=fac[1]=inv[0]=inv[1]=f[1]=1;for(int i=2;i<=n;i++)fac[i]=1ll*i*fac[i-1]%mo,f[i]=1ll*(mo-mo/i)*f[mo%i]%mo,inv[i]=1ll*f[i]*inv[i-1]%mo;for(int i=0;i<=n;i++){C[i][0]=C[i][i]=1;for(int j=1;j<i;j++)C[i][j]=add(C[i-1][j-1],C[i-1][j],mo);}for(int i=0;i<=A;i++)pw[0][i]=1;for(int i=1;i<=n;i++)for(int j=0;j<=A;j++)pw[i][j]=1ll*j*pw[i-1][j]%mo;
}
signed main(){freopen("legend.in","r",stdin);freopen("legend.out","w",stdout);read(n);read(m);read(A);init();dp[0][0][0]=1;for(int x=1;x<=A;x++){int now=x&1,las=now^1;for(int i=0;i<=n;i++)for(int j=i;j<=m;j++)dp[now][i][j]=0;for(int i=0;i<=n;i++){sum[0]=0;for(int k=1;k<=n-i;k++)sum[k]=add(sum[k-1],1ll*C[n-i][k]*pw[n-i-k][A-x]%mo,mo);for(int j=max(i,m-x+1);j<=m;j++)Add(ans,1ll*i*C[n][i]%mo*dp[las][i][j]%mo*pw[n-i][A-x+1]%mo,mo);for(int j=i;j<=m-x;j++)if(dp[las][i][j]){int t=(m-j)/x;for(int k=1,tp=x;k<=min(t,n-i);k++,tp+=x)Add(dp[now][i+k][j+tp],1ll*C[i+k][k]*dp[las][i][j]%mo,mo);if(n-i>t)Add(ans,1ll*add(sum[n-i],mo-sum[t],mo)*C[n][i]%mo*(i+t)%mo*dp[las][i][j]%mo,mo);Add(dp[now][i][j],dp[las][i][j],mo);}}}for(int i=0;i<=m;i++)Add(ans,1ll*n*dp[A&1][n][i]%mo,mo);printf("%d\n",1ll*ans*qkpow(qkpow(A,n,mo),mo-2,mo)%mo);return 0;
}

谢谢!!!

[海军国际项目办公室]猪国杀相关推荐

  1. BZOJ1972:[SDOI2010]猪国杀

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  2. 山大程序设计思维与实践 六月模拟:猪国杀

    六月模拟:猪国杀 山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业H 山大程序设计思维实践作业H 山东大学程序设计思维 ...

  3. [洛谷P2482][SDOI2010]猪国杀

    题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...

  4. [luogu P2482] [SDOI2010]猪国杀

    [luogu P2482] [SDOI2010]猪国杀 题目描述 <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只 ...

  5. SDOI2010 猪国杀

    题目描述 <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色. 游戏目的: 主猪(MP):自己存活的情 ...

  6. [sdoi]猪国杀 题面

    题目描述 Description <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色. 游戏目的: 主 ...

  7. 【模拟】【bzoj1972】【SDOI2010】猪国杀

    1972:[SDOI2010]猪国杀 [题目描述] <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色 ...

  8. 洛谷P2482 [SDOI2010]猪国杀 题解

    本来这题打算5.15省选考完之后晚上做的,然而15号考了一天的试,于是放16号晚上做了. 原题传送门 题目分析 猪国杀是一道桌游三国杀的简化版,这道题在代码涉及的知识点上难度很低,主要难度就在于如何实 ...

  9. 三国杀周边--------猪国杀题解

    [SDOI2010]猪国杀 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有 3 3 3 种角色:主猪,忠猪,反猪.每局游戏主猪有且只有 1 1 1 只,忠猪和反猪可以有多只 ...

最新文章

  1. Flink State和容错机制
  2. ajaxToolkit发布之后出错!说未能加载文件或程序集!
  3. mysql 5.6 双向互备_mysql双主互备
  4. PHPMySQL——防止SQL注入-代码片段
  5. windows mongdb 安装
  6. windows下开启 PHP扩展Redis
  7. HTML5新增音频标签(HTML5)
  8. RabbitMQ-理解消息通信-虚拟主机和隔离
  9. 【深入浅出通信原理-学习笔记】天线技术
  10. 龙芯3A5000笔记本安装开源操作系统loongnix记录
  11. 企业WiFi认证,怎么确保企业WiFi安全?
  12. vsomeip源码梳理 -- OfferService流程
  13. Gocv图片合成视频(无音频)
  14. 阿里云虚拟主机Nginx配置
  15. 分分钟拯救监控知识体系
  16. 迷你电脑将取代笨重的台式机
  17. 【Docker】7、数据卷详解:具名挂载、匿名挂载、初识DockerFile、数据卷容器
  18. 数据机房智能母线槽技术分析
  19. Java获取请求头、参数、路径、
  20. rancher rke 集群恢复

热门文章

  1. word中表格文字不自动换行的方式
  2. 九九减法.加法.除法表大全
  3. autowire异常的三个情况
  4. 计算机排版自然段视频教程,教你学会视频竖屏制作技巧
  5. iOS最全性能优化(中)
  6. 北京航空大学计算机系余明明,于明明
  7. ‘井底蛙’与‘墙内人’
  8. Ubuntu(Linux)下鼠标锁死变成十字
  9. 流程图怎么绘制?分享三个制作工具
  10. 腾讯薪酬改革:晋升不再直接调薪;iPhone 4S 和 6S 将被列入过时产品;Perl 5.36.0发布|极客头条...