[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. rein 多平台支持的超便携端口转发与内网穿透工具

    介绍 本程序主要用于进行反向代理IP地址和端口,功能类似于 nginx 的 stream 模式和rinetd 的功能:在(1.0.5)版本开始,rein支持内网穿透,这一功能类似于frp 和ngrok ...

  2. 在Ubuntu下的OpenStack中配置使用Spice协议

    在Ubuntu下的OpenStack中配置使用Spice协议 by 无若 ####控制节点#安装apt-get install nova-spiceproxy spice-html5 spice-vd ...

  3. Python3中dict字典的相关操作函数

    字典对象的内建函数 1. clear() 清空字典. 例: >>> a = {1:3, 2:4} >>> a.clear() >>> a {} 2 ...

  4. Azure 实践(1)- Azure Devops Server 安装

    1.Azure Devops介绍 Azure DevOps Server 2020 (之前的名称为TFS),作为微软Azure DevOps 的企业私有(on-premises)服务器,是一个为开发团 ...

  5. 【原创】Dubbo 2.7.8多个远程代码执行漏洞

    马上年底了,发现年初定的几个漏洞的KPI还没来得及完成,趁着最近有空赶紧突击一波,之前业务部门被爆过Dubbo的漏洞,干脆就把Dubbo拖过来挖一把.之前没用过Dubbo,既然要挖它就先大体了解了一下 ...

  6. 程序员作图工具和技巧,你 get 了么?

    分享程序员常用的画图软件和小技巧 大家好,我是鱼皮. 说实话,我觉得做个程序员挺好的.日常工作有很多,写代码.对需求.写方案等等,但我最爱画图:流程图.架构图.交互图.功能模块图.UML 类图.部署图 ...

  7. noip25

    T1 经过一波大力推式子,发现答案是 \(\frac{n^{2}-1}{9}\) . 式子回头再补,可能会 Code #include<cstdio> #define re registe ...

  8. NOIP 模拟 $13\; \text{玄学题}$

    题解 题如其名,是挺玄学的. 我们发现每个值是 \(-1\) 还是 \(1\) 只与它的次数是奇是偶有关,而 \(\sum_j^{j\le m}d(i×j)\) 又只与其中有多少个奇数有关 对于 \( ...

  9. 详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿

    说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部 ...

  10. uwp 的work project 的 取消闹钟

    private void initalAlarmHanle() { string cancelAlarm = "CancelAlarmEvent"; ConnectionManag ...