题目链接 题目详情 (pintia.cn)

题目

题意

有n个物品在他们面前,编号从1自n.两人轮流移走物品。在移动中,玩家选择未被拿走的物品并将其拿走。当所有物品被拿走时,游戏就结束了。任何一个玩家的目标是最大化他们拿走的物品的价值之和。

二人都足够聪明,有多少可能的游戏过程?结果取模998244353.

如果存在一些整数相等,但是下标不一样,算为两种方式。

题解

此题可以抽象为有序序列,第一个位置第一次被拿走,第二个位置第二次被拿走,后者亦然,求有多少种符合条件的序列

1. 最大值若为单数个,第一个人一定拿走,对于种数并没有贡献

2. 最大值若为双数个,第一个人拿走一个,后面人一定也要拿走一个

3. 每次拿完,都可以抽象为前两种。

以下为用高中排列组合思考问题:

AC代码

组合数用逆元求,如果按正常阶乘算,若 被除数取模过,那么结果也就不一样了

  1. // #include<bits/stdc++.h>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <string>
  6. #include <cstring>
  7. #include <vector>
  8.  
  9. using namespace std;
  10.  
  11. typedef long long LL;
  12. typedef pair<int,int> PII;
  13.  
  14. const int N = 1e6+10;
  15. const LL mod = 998244353;
  16. int st[N];
  17. LL fact[N], infact[N];
  18.  
  19. LL qmi(LL x, LL k)//快速幂
  20. {
  21. LL res = 1;
  22. while(k)
  23. {
  24. if(k&1)
  25. res = (LL)res * x %mod;
  26. k >>= 1;
  27. x = (LL)x * x % mod;
  28. }
  29. return res;
  30. }
  31. void init(int n)
  32. {
  33. fact[0] = 1, infact[0] = 1;
  34. for(int i = 1; i <= n; i ++)
  35. {
  36. fact[i] = fact[i-1]*i%mod;//n的阶乘
  37. infact[i] = infact[i-1]*qmi((LL)i, mod-2)%mod;//逆元
  38. }
  39. return;
  40. }
  41. LL zuhe(int n, int m)//求组合数
  42. {
  43. return fact[n] * infact[n-m] %mod* infact[m]%mod;
  44. }
  45. int main(){
  46. vector<PII> a;
  47. int n;
  48. cin >> n;
  49. init(n);
  50. int idx = 0;
  51. for(int i = 0; i < N; i ++) st[i] = -1;
  52. for(int i = 0; i < n; i ++)
  53. {
  54. int x;
  55. cin >> x;
  56. if(st[x]>=0) a[st[x]].second ++;//记录每个数出现了几次
  57. else
  58. {
  59. a.push_back({x, 1});
  60. st[x] = idx ++;
  61. }
  62. }
  63. sort(a.begin(), a.end());
  64. int sum = 0;
  65. LL res = 1;
  66. for(int i = a.end()-a.begin()-1; i >= 0; i --)sum+=a[i].second;
  67.  
  68. //数学公式实现过程
  69. for(int i = a.end()-a.begin()-1; i >= 0; i --)
  70. {
  71. sum -= a[i].second;
  72. int c = a[i].second;
  73. if(c >= 2)
  74. res = res * fact[c]%mod * zuhe((sum + c/2), c/2)%mod;
  75.  
  76. }
  77. cout << res <<endl;
  78.  
  79. return 0;
  80. }

【2021 ICPC Asia Jinan 区域赛】 C Optimal Strategy推公式-组合数-逆元快速幂的更多相关文章

  1. ICPC 2018 焦作区域赛

    // 2019.10.7 练习赛 // 赛题来源:2018 ICPC 焦作区域赛 // CF链接:http://codeforces.com/gym/102028 A Xu Xiake in Hena ...

  2. 2021ICPC网络赛第一场部分题解-The 2021 ICPC Asia Regionals Online Contest (I)

    写在前面 本来应该6题的,结果不知道哪个铸币发了H的clar,当即把我们的思路转向三维几何上.当时我们还在想这三维计算几何的正确率有点太高了还在感叹ICPC选手的含金量,直到赛后我才知道这H题的铸币出 ...

  3. 2017 ICPC/ACM 沈阳区域赛HDU6228

    Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  4. 2017 ICPC/ACM 沈阳区域赛HDU6223

    Infinite Fraction Path Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java ...

  5. (最新)2019年ICPC东亚地区-区域赛赛站网络赛以及现场赛时间安排

  6. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)-L Bit Sequence

    题意 给你两个数l,m,大小为m的数组a,求[0,l]之间满足以下条件的数x的个数: 对于任何i输入[0,m-1],f(x+i)%2=a[i]:f(k):代表k在二进制下1的个数 m的范围<=1 ...

  7. 计蒜客模拟赛D2T1 蒜头君的兔子:矩阵快速幂

    题目链接:https://nanti.jisuanke.com/t/16442 题意: 有个人在第一年送了你一对1岁的兔子.这种兔子刚生下来的时候算0岁,当它在2~10岁的时候,每年都会生下一对兔子, ...

  8. ACM学习历程—HDU5490 Simple Matrix (数学 && 逆元 && 快速幂) (2015合肥网赛07)

    Problem Description As we know, sequence in the form of an=a1+(n−1)d is called arithmetic progressio ...

  9. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

随机推荐

  1. 使用ipmitool工具来使用串口连接远程主机

    https://www.ibm.com/developerworks/cn/linux/l-ipmi/index.html ipmitool -H 9.13.2.213 -U root -P xxxx ...

  2. 寻路算法之A*算法详解

    前言 在实际开发中我们会经常用到寻路算法,例如MMOARPG游戏魔兽中,里面的人物行走为了模仿真实人物行走的体验,会选择最近路线达到目的地,期间会避开高山或者湖水,绕过箱子或者树林,直到走到你所选定的 ...

  3. bzoj5315/luoguP4517 [JSOI2018]防御网络(仙人掌,dp)

    bzoj5315/luoguP4517 防御网络(仙人掌,dp) bzoj Luogu 题目描述略(太长了) 题解时间 本题和斯坦纳树无关. 题面保证了是一个仙人掌...? 但这个环之间甚至交点都没有 ...

  4. HTTP1.0和HTTP1.1和HTTP2.0的区别

    1 HTTP1.0和HTTP1.1的区别1.1 长连接(Persistent Connection)       HTTP1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求 ...

  5. 【Java面试宝典】什么情况下会发生栈内存溢出?

    如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常. 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常.

  6. BIO、NIO、AIO的区别

    一.基本概念 1.BIO:同步阻塞IO 2.NIO:同步非阻塞IO 3.AIO:异步阻塞IO IO操作包括两部分,发起IO请求.IO数据读写.阻塞非阻塞主要针对线程发起IO请求之后是否立即返回来定义的 ...

  7. ssl免密登录(centos6)

    1.首先执行ll -a查看是否有隐藏文件.ssh,如果没有,需要执行ssh localhost登录以下即可 cd ~/.ssh 2.生成秘钥: 可查看https://hadoop.apache.org ...

  8. 详解Mysql事务隔离级别与锁机制

    一.概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能 就会导致我们说的脏写. 胀读和不可重复读.幻读这些问题. 这些问题的本质都是数据库的多事务并 ...

  9. scrapy 如何链接有密码的redis scrapy-redis 设置redis 密码 scrapy-redis如何为redis配置密码

    # 使用scrapy_redis的调度器SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 使用scrapy_redis的去重机制DUP ...

  10. 开发一个自己的 CSS 框架(四)

    这一节,我们来讲规矩,谈网格,做人可以不要脸,不讲规矩,不讲道理(特指傲娇兽),但底线还是要有的,如同网格一样,不能超出. jeet 这里我们别人封装好的模块,不过呢,我们也会详细介绍一下原理.首先我 ...