[AtcoderABC200E]Patisserie

题面翻译

对于一个三元组\((i,j,k)\) 我们对它按如下要求进行升序排序:

  • 第一关键词 \(i + j + k\) 即三者总和

  • 第二关键词 \(i\)

  • 第三关键词 \(j\)

特别的 我们给出了\(n\)

对于任何一个三元组\((i,j,k)\ i\in[1,n], j\in[1,n], k\in[1,n]都存在\)

现在给出\(P\) 求出排名为P的三元组的具体元素 即\((i,j,k)\)

\(n \leq 10^6\ \ k \leq 10^3\)

思路

类似于Contor展开的排列计数方法

也就是试填法

即枚举每一项元素 通过函数\(calc()\)计算该项排列或是数列的个数

根据排名快速确定每一位元素

现在的问题就是如何实现\(calc()\)

你可以通过打表 或是 硬推 得到一部分思路

根据第一个条件先确定第一位 (因为总和确定后面就好搞了

很容易可以发现

第一个条件就是再求\(
\begin{cases}
i + j + k = x \\
i \leq n \\
j \leq n \\
k \leq n \\
\end{cases}
\)的方案数

那么 随便 一算可以推出方案数

\[g(x)=
\begin{cases}
0,\quad x\in(-\infty,3)\cup(3n,\infty) \\
\frac{(x-1)(x-2)}{2},\quad x\in[3,3n]
\end{cases}
\]

或者说是

\[\left(
\begin{matrix}
x-1 \\
2 \\
\end{matrix}
\right)
\]

然后我们考虑一下加上限制

加上其中一项 就把它减去n算一下之前的g(x)

即\(g(x - n)\) 也就是

\[\left(
\begin{matrix}
x-n \\
2
\end{matrix}
\right)
\]

然后可以随意加其中一个 共有三种方案 系数为-3

任选其中两项、三项(好像用不到)同理

那么真正的方案书\(f(x)\)也就是

\[f(x) = g(x) - 3g(x - n) + 3g(x - 2n) - g(x - 3n)
\]

补充:

这里还有一种DP写法 可能会好理解一些

本文就不再赘述 请读者自行思考或查阅

总结

这道题放在定位为普及模拟赛T2令人着实很吃惊

主要是时间较紧也就成了选手实力的分水岭

要看能不能往组合数的角度(插板法 也许吧)去想了

俺比赛的时候推出第一个式子以为是高阶等差数列 就开始没推出来

还是经验太少了 毕竟OI的数学题还是相对挺少的

Code

说实话真的短 就是思路挺妙的

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring> using namespace std; #define int long long int read(int x = 0, bool f = false, char ch = getchar()) {
for (; !isdigit(ch); ch = getchar()) f |= (ch == '-');
for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
return f ? ~x + 1 : x;
} int g(int x) {return x <= 2? 0 : ((x - 1) * (x - 2)) / 2;} int f(int x, int y) {return g(x) - 3 * g(x - y) + 3 * g(x - 2 * y) - g(x - 3 * y);} int n, k; signed main() {
// freopen("cake.in", "r", stdin);
// freopen("cake.out", "w", stdout);
n = read(), k = read();
for (int i = 3; i <= 3 * n; ++i) {
if (k <= f(i,n)) {
for (int j = 1; j <= n; ++j) {
int mn = max(1ll, i - j - n), mx = min(n, i - j - 1ll);
if (mx < mn) continue;
if (k <= mx - mn + 1)
return printf("%lld %lld %lld\n", j, mn + k - 1, i - j - mn - k + 1), 0;
k -= mx - mn + 1;
}
} else k -= f(i,n);
}
}

[AtcoderABC200E]Patisserie的更多相关文章

  1. The 10 best sweet treats in Singapore

    Every time I walk out of Changi airport's air-conditioning into the humid outdoors, there's a sweet ...

  2. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  3. CET4

    Directions: For this part, you are allowed 30 minutes to write a short essay on the challenges of st ...

  4. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

随机推荐

  1. 被字节跳动、小米、美团面试官问的AndroidFramework难倒了? 这里有23道面试真题,助力成为offer收割机!

    目录 1.Android中多进程通信的方式有哪些?a.进程通信你用过哪些?原理是什么?(字节跳动.小米)2.描述下Binder机制原理?(东方头条)3.Binder线程池的工作过程是什么样?(东方头条 ...

  2. 利用system generator 生成vivado ip—以低通滤波器举例

    前段时间自学了matlab和vivado联合推出的system generator工具,用来做数字信号处理,十分好用且使开发更便捷,下面举个例子来供大家一起学习下. 首先打开matlab命令行,输入s ...

  3. 【原创】在macOS Big Sur (Silicon M1, ARM)中配置ASP运行环境

    亲测有效,转载请附原文地址. 一,安装Parallels Desktop,注意选择支持ARM的版本. 二,注册 Windows Insider Preview Downloads 账号,通过以下链接下 ...

  4. rabbitMQ通过@RabbitListener和配置文件XML创建exchange及队列绑定关系

    1.@RabbitListener 2.配置文件 <rabbit:fanout-exchange name="fanoutExchange" xmlns="http ...

  5. Python - typing 模块 —— NewType

    前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...

  6. DHCP服务-自动管理IP地址和分配固定IP

    dhcp服务 端口:67 配置文件:/etc/dhcp/dhcpd.conf 自动分配IP: 一. 安装服务:yum install dhcp 安装过程省略 二.首先,看到配置文件中啥也没有,他的配置 ...

  7. 单片机学习(八)点阵LED的使用

    目录 一.点阵LED的理论知识 1. 点阵屏的打开方式 2. LED点阵简介 3. 点阵LED的结构和操作方式 4. 74HC595模块 PPT上的简介 串行转并行的工作原理 二.编码实现 1. C5 ...

  8. 【原创】JavaFx程序解决Jupyter Notebook导出PDF不显示中文

    0.ATTENTION!!! JavaFx里是通过Java调用控制台执行的的jupyter和xelatex指令, 这些个指令需要在本地安装Jupyter和MikTeX之后才能正常在电脑上运行 1.[问 ...

  9. spring security 入门级全篇代码

    CustomAccessDecisionManager 类 ---------------------------------------------------------------------- ...

  10. mfc HackerTools全局钩子

    钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术. 如在键盘中按下一键,操作系统将收到键按下消息,把消息放入消息队列,然后消息队列对消息进行派发,发给相应的应 ...