首页 > 其他分享 >CF2034F2 Khayyam's Royal Decree (Hard Version)

CF2034F2 Khayyam's Royal Decree (Hard Version)

时间:2024-12-02 11:11:51浏览次数:10  
标签:CF2034F2 kMod Decree return int Hard 道具 mul scr

把问题改写成在网格图上走,一个红球或蓝球对应了网格图上的一条边。最后只要把答案除以 \(\dbinom{n+m}{m}\) 即可。

价值 \(\times 2\) 不好表示,考虑把带 \(2^c\) 倍价值的球看成一个球 和 \(2^c-1\) 个“复制品”。每次使用道具相当于将每个球都复制一遍。

考虑对于每个道具,计算其从非“复制品”复制出来的球的贡献。

对于一条 \((0,0)\to (n,m)\) 的路径,其中一个点 \((x,y)\) 的贡献 \(2^c\),\(c\) 为之后的道具数量。此处道具的限制为【当前背包里有 \(r\) 个红球,\(b\) 个蓝球】。

考虑 \(2^c\) 的组合意义,其可以表示为钦定一个道具的子集必须经过。

于是可以 dp,\(f_i\) 为从道具 \(i\) 对应的点开始走,并钦定若干道具必须经过的方案数。

显然有 \(f_i=\sum f_j\times tot_{i,j}\),其中 \(tot_{i,j}\) 为从道具 \(i\) 到道具 \(j\) 的方案数,即 \(\dbinom{r_j-r_i+b_j-b_i}{r_j-r_i}\)。

考虑怎么计算答案。方便起见,添加两个道具 \((0,0)\) 和 \((n,m)\)。其编号为 \(0\) 和 \(k+1\)。那么对于一个道具 \(i\),其贡献为 \(tot_{0,i}\times(2\times r_i+b_i)\times f_i\),求和即可。

#include <bits/stdc++.h>
#define ALL(x) begin(x), end(x)
using namespace std;
void file() {
  freopen("1.in", "r", stdin);
  freopen("1.out", "w", stdout);
}
using ll = long long;

namespace QwQ {
  const int kMod = 998244353;
  void Add(int& x, int y) { ((x += y) >= kMod) && (x -= kMod); }
  void Sub(int& x, int y) { ((x -= y) < 0) && (x += kMod); }
  int Sum(int x, int y) { return Add(x, y), x; }
  int Dif(int x, int y) { return Sub(x, y), x; }
  int qpow(int x, int y) {
    int b = x, r = 1;
    for(; y; b = (ll)b * b % kMod, y /= 2) {
      if(y & 1) {
        r = (ll)r * b % kMod;
      }
    }
    return r;
  }

  const int kN = 4e5 + 5, kL = 5005;
  int n, m, k;
  array<int, kN> mul, imul;
  array<array<int, kL>, kL> tot;
  array<int, kL> f;

  struct Scr {
    int r, b;
    Scr() {  }
    Scr(int _r, int _b) {
      r = _r, b = _b;
    }
    int Eval() { return 2 * r + b; }
  };
  array<Scr, kL> scr;

  void init() {
    mul[0] = 1;
    for(int i = 1; i < kN; i++) {
      mul[i] = (ll)mul[i - 1] * i % kMod;
    }
    imul[kN - 1] = qpow(mul[kN - 1], kMod - 2);
    for(int i = kN - 2; i >= 0; i--) {
      imul[i] = (ll)imul[i + 1] * (i + 1) % kMod;
    }
  }
  int C(int n, int m) {
    if(min({n, m, n - m}) < 0) {
      return 0;
    }else {
      return (ll)mul[n] * imul[m] % kMod * imul[n - m] % kMod;
    }
  }
  int invC(int n, int m) {
    if(min({n, m, n - m}) < 0) {
      return 0;
    }else {
      return (ll)imul[n] * mul[m] % kMod * mul[n - m] % kMod;
    }
  }

  void solve() {
    cin >> n >> m >> k;
    for(int i = 1; i <= k; i++) {
      cin >> scr[i].r >> scr[i].b;
      scr[i].r = n - scr[i].r;
      scr[i].b = m - scr[i].b;
    }
    scr[++k] = Scr(0, 0);
    scr[++k] = Scr(n, m);
    sort(scr.data() + 1, scr.data() + k + 1,
      [&](Scr x, Scr y) { return x.r + x.b < y.r + y.b; });
    fill_n(f.data(), k + 1, 0);
    f[k] = 1;
    for(int i = k; i >= 1; i--) {
      tot[i][i] = 1;
      int r = scr[i].r, b = scr[i].b;
      for(int j = i + 1; j <= k; j++) {
        int R = scr[j].r, B = scr[j].b;
        if((R >= r) && (B >= b)) {
          tot[i][j] = C(R - r + B - b, R - r);
          Add(f[i], (ll)tot[i][j] * f[j] % kMod);
        }
      }
    }
    int ans = 0;
    for(int i = 1; i <= k; i++) {
      Add(ans, (ll)tot[1][i] * f[i] % kMod * scr[i].Eval() % kMod);
    }
    cout << (ll)ans * invC(n + m, n) % kMod << "\n";
  }

  int main() {
    file();
    ios::sync_with_stdio(0), cin.tie(0);
    init();
    int T = 1;
    cin >> T;
    while(T--) solve();
    return 0;
  }
} // QwQ

int main() {
  return QwQ::main();
}

标签:CF2034F2,kMod,Decree,return,int,Hard,道具,mul,scr
From: https://www.cnblogs.com/cjoierzdc/p/18581287

相关文章

  • sharding-jdbc分表场景下的分页查询优化
    背景欢迎来到Java学院,我们学院学员众多,每年都要招收新学员。但是,我们学院并没有“毕业”这一机制,所以年复一年学员的数量就越来越多。咱们学院每年都有一次大考,需要统计所有学员的成绩,并按排名的先后顺序公示给大家。第一年我们招收了1,000名学员。在一年过后,我们的公示栏分为......
  • 使用 Keil 新建 Arm Visual Hardware(AVH) 项目
    1新建并配置项目1.1新建项目我这里想模拟Cortex-M55核心,因此选择SSE-300-MPS3由于是简单教程,我只想输出一个最简单的HelloWorld,因此仅勾选串口相关的组件这里还需要特殊勾选一下以下选项1.2配置TargetSoftwareModel处选择TrustZonedisabledRead/WriteMemo......
  • Paper Reading: Relating instance hardness to classifcation performance in a d
    目录研究动机文章贡献实例空间分析ISA框架实例空间构造足迹分析单个数据集的ISA硬度度量指标算法和性能评估特征选择实例空间表示和足迹实验结果案例研究:对于COVIDprognosis数据集的ISA分析案例研究:使用ISA检测COMPAS数据集算法偏差案例分析:使用ISA分析标签噪声数据......
  • mongodb shard 分片集群基础概念
    目录一、shard集群二、ConfigServer1、config.shards2、config.database3、config.collection4、config.chunks5、config.settings6、其他三、shard机制1、PrimaryShard2、ShardKey2.1范围分片2.2哈希分片2.3ShardKey重定义2.4版本约束2.5ShardKey......
  • Hardware/Software Co-Exploration of Neural Architectures——神经架构的硬件/软件
    在一些研究工作中,探索实践与硬件平台端协同探索的方式来指导神经网络模型的结构设计优化,本文是对《Hardware/SoftwareCo-ExplorationofNeuralArchitectures》论文的阅读学习整体的论文阅读笔记,感兴趣的话可以参考下,如果想要进一步了解工作内容详情,建议移步阅读原英文论文,地......
  • 【状态机DP】【hard】力扣188. 买卖股票的最佳时机 IV
    给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次,卖k次。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例......
  • ros2_control 架构分析(2)-HardwareInterface
    1.介绍在ROS2_control框架中,hardware模块负责与物理硬件进行直接通信。它抽象了三类硬件:system、sensor和actuator,分别对应复杂的系统、仅输出数据的传感器和仅接收输入的执行器。2.类与接口在ROS2_control中,system、sensor和actuator作为三个核心类存在被上层调用,它们各自......
  • orchard core 2.02 的模块 学习1 实践:创建阿里云sms模块
    1、手动创建2、命令行从模板创建手动创建就是复制一个官方的任意模块。这个不细说。2、我是从命令行创建的。首先要安装orchardcore的模板dotnetnewinstallOrchardCore.ProjectTemplates::2.0.2参考:https://docs.orchardcore.net/en/latest/getting-started/templates......
  • Sharding-JDBC标准模式详解
    Sharding-JDBC标准模式详解一.为什么要使用标准模式?Sharding-JDBC的标准模式就配置而言比inline模式繁琐多了,那为什么要使用标准模式呢Sharding-JDBC作为ApacheShardingSphere生态中的一款轻量级Java框架,提供了数据分片、读写分离、分布式事务和数据库治理等核心功......
  • 题解:P10370 「LAOI-4」Mex Tower (Hard ver.)
    ProblemLink「LAOI-4」MexTower(Hardver.)题意给定一个长度为$n$的序列$a$,求序列的$\operatorname{Mex}$值是否大于等于其他所有长度为$n$的自然数序列的$\operatorname{Mex}$值。Solution不难发现,两个数或一个序列的$\operatorname{Mex}$一定是......