[AtcoderABC200E]Patisserie
[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\)
思路
也就是试填法
即枚举每一项元素 通过函数\(calc()\)计算该项排列或是数列的个数
根据排名快速确定每一位元素
现在的问题就是如何实现\(calc()\)
你可以通过打表 或是 硬推 得到一部分思路
根据第一个条件先确定第一位 (因为总和确定后面就好搞了
很容易可以发现
第一个条件就是再求\(
\begin{cases}
i + j + k = x \\
i \leq n \\
j \leq n \\
k \leq n \\
\end{cases}
\)的方案数
那么 随便 一算可以推出方案数
\begin{cases}
0,\quad x\in(-\infty,3)\cup(3n,\infty) \\
\frac{(x-1)(x-2)}{2},\quad x\in[3,3n]
\end{cases}
\]
或者说是
\begin{matrix}
x-1 \\
2 \\
\end{matrix}
\right)
\]
然后我们考虑一下加上限制
加上其中一项 就把它减去n算一下之前的g(x)
即\(g(x - n)\) 也就是
\begin{matrix}
x-n \\
2
\end{matrix}
\right)
\]
然后可以随意加其中一个 共有三种方案 系数为-3
任选其中两项、三项(好像用不到)同理
那么真正的方案书\(f(x)\)也就是
\]
补充:
这里还有一种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的更多相关文章
- 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 ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- CET4
Directions: For this part, you are allowed 30 minutes to write a short essay on the challenges of st ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
随机推荐
- 一周内被程序员疯转3.2W次,最终被大厂封杀的《字节跳动Android面试手册》!
一眨眼又到金三银四了,不知道各位有没有做好跳槽涨薪的准备了呢? 今天的话大家分享一份最新的<字节跳动Android面试手册>,内容包含Android基础+进阶,Java基础+进阶,数据结构 ...
- Docker入门第一章
Docker为什么出现? 一款产品:开发到上线 两套环境!应用环境,应用配置! 可能在开发环境你的产品是正常的,但是到了线上环境你的产品可能就会出现各种原因,或许是因为环境的不同,也可能是因为配置的不 ...
- Alibaba-技术专区-Dubbo3总体技术体系介绍及技术指南(目录)
Dubbo3开题简介 如开篇所述,Dubbo 提供了构建云原生微服务业务的一站式解决方案,可以使用 Dubbo 快速定义并发布微服务组 件,同时基于 Dubbo 开箱即用的丰富特性及超强的扩展能力,构 ...
- 计算机专业学了快一年, 只会一点C语言,你好意思说自己是IT专业的?
目录 一.C/C++入门阶段 学习视频推荐:C++入门基础[B站 小甲鱼] 二.C/C++开发进阶 学习视频推荐:C++进阶[慕课网 免费课] 三.C++开发高级 视频教程:程序设计[中国大学MOOC ...
- SpringMVC学习08(拦截器)
8.拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. 过滤器与拦截器的区别: ...
- SpringMVC学习05(整合ssm)
5.整合SSM 环境要求 环境: IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 要求: 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单 ...
- Shell-03-表达式和运算符
表达式和运算符 条件表达式语句 [ 1 -eq 1 ] [[ 1 -eq 1 ]] test 1 -eq 1 等同于 [ 1 -eq 1 ] [root@satest_192-168-3-121 sh ...
- Git(7)-- 查看提交历史(git log 命令详解)
@ 目录 1.git clone 2.git log 3.git log -p 4.git log --stat 5.git log --pretty=oneline 6.git log --pret ...
- 基于 CODING CD + Nocalhost 在大型应用的 ChatOps 实践
本文作者:红亚科技 CTO--卢兴民 红亚科技聚焦信息技术发展,为信息技术相关专业提供优质教学服务 背景 ChatOps 最早起源于 GitHub,它以沟通平台为中心,通过与机器人产生对话和交互,使开 ...
- window 右键菜单中添加在vs code 打开
原文链接: window 右键菜单中添加在vs code 打开 window 右键菜单中添加在vs code 打开 吃码小妖:以前安装VS code可以的,后面不知道为什么不能右键在VS code中打 ...