当前位置: 首页 > news >正文

[清华集训2016]你的生命已如风中残烛——组合数学

题目链接:

[清华集训2016]你的生命已如风中残烛

题目大意:共有$m+1$张牌,其中有$n$张特殊牌,每张特殊牌有一个权值$w_{i}$表示取到这张牌能获得$w_{i}$次再抽牌的机会,保证$\sum w_{i}=m$,现在规定最后一张牌(即指定最后一张牌是哪个),初始抽第一张牌,求有多少种卡牌排列方式能使$m+1$张牌被抽完。

总方案数显然是$(m+1)!$即$m+1$个数的全排列,我们先不考虑强制固定最后一张牌的方案。将每一张牌给出一个权值表示抽到这张牌能获得的再摸牌的次数,显然普通牌的权值是$-1$,而特殊牌的权值是$w_{i}-1$,因为第一张牌抽取时不耗费摸牌次数,所以第一张牌的权值是$w_{i}$。那么求出每个位置$i$的前缀和即可表示抽完前$i$张牌后还剩的摸牌次数。显然如果一种排列合法最后一个位置(即$m+1$)的前缀和为$0$且之前每个位置的前缀和都大于$0$。那么对于一种合法排列如果将前面任意多张牌拿到最后,拿走部分的和是大于$0$的(设为$x$),那么没被移动的这些位置的前缀和就都要减$x$,没移动之前的最后一个位置的前缀和就是$-x<0$,即一定是不合法的。而对于任意一种排列,一定存在一个前缀和最小且最右的位置,对于这个位置之后的部分单独来看(即去掉这个位置及之前的部分)每个位置的前缀和一定大于0,所以只要把这个位置之后的部分拿到排列的最前面就能构造出这种排列循环同构的$(m+1)$种排列中合法的那种。所以可以得出结论对于循环同构的$m+1$个排列有且只有一个排列是合法的。合法的方案数就是$\frac{(m+1)!}{m+1}$即$m!$,而在这些合法的情况中被固定的那最后一张牌可能在普通牌的$(m+1-n)$个位置中的任意一个且在每个位置的方案数相同,所以最后的答案就是$\frac{m!}{m+1-n}$。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long 
#define mod 998244353
using namespace std;
int n,m;
int w[41];
ll ans=1ll;
ll quick(int x,int y)
{
    ll res=1ll;
    while(y)
    {
        if(y&1)
        {
            res=res*x%mod;
        }
        x=1ll*x*x%mod;
        y>>=1;
    }
    return res;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&w[i]);
        m+=w[i];
    }
    for(int i=1;i<=m;i++)
    {
        ans=ans*i%mod;
    }
    ans=ans*quick(m-n+1,mod-2)%mod;
    printf("%lld",ans);
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10261442.html

相关文章:

  • MySQL--各版本DDL 操作总结
  • 将matlab数据保存为excel文件
  • 全程软件测试:软件测试的标准观点
  • 秋季学习总结
  • idou老师教你学Istio 23 : 如何用 Istio 实现速率限制
  • flex弹性布局心得
  • 机器学习KNN实例之数字识别
  • Jeesite 代码生成
  • IP地址子网划分
  • OpenStack 虚机网卡的创建过程
  • 使用 FFT 分析周期性数据
  • SpringBoot 通用Error设计
  • 浅谈斜率优化dp
  • emacs
  • R 语言设定随机数种子
  • 2017-08-04 前端日报
  • angular2 简述
  • AngularJS指令开发(1)——参数详解
  • Facebook AccountKit 接入的坑点
  • Gradle 5.0 正式版发布
  • vue 个人积累(使用工具,组件)
  • Vue ES6 Jade Scss Webpack Gulp
  • Web设计流程优化:网页效果图设计新思路
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 分享一份非常强势的Android面试题
  • 基于Android乐音识别(2)
  • 基于HAProxy的高性能缓存服务器nuster
  • 简单实现一个textarea自适应高度
  • 京东美团研发面经
  • 如何合理的规划jvm性能调优
  • 如何在 Tornado 中实现 Middleware
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 说说我为什么看好Spring Cloud Alibaba
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET下的多线程编程—1-线程机制概述
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @property python知乎_Python3基础之:property
  • @property括号内属性讲解
  • @RequestBody的使用
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [AR Foundation] 人脸检测的流程
  • [BT]BUUCTF刷题第8天(3.26)
  • [bzoj1324]Exca王者之剑_最小割
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [Codeforces1137D]Cooperative Game
  • [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信
  • [java]删除数组中的某一个元素
  • [java面试]宇信易诚 广州分公司 java笔试题目回忆录