Codeforces Global Round 8 B. Codeforces Subsequences(构造)
2024-09-06 09:54:25
题目链接:https://codeforces.com/contest/1368/problem/B
题意
构造最短的至少含有 $k$ 个 $codeforces$ 子序列的字符串。
题解
如下表:
c | o | d | e | f | o | r | c | e | s | 子序列个数 | |
个数 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | $1^{10}$ |
2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | $2^{10}$ | |
3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | $3^{10}$ |
依次构造每个字符的个数即可。
证明
c | o | d | e | f | o | r | c | e | s | 子序列个数 | |
个数 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | $4$ |
2 | 3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | $6$ | |
2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | $8$ |
向第一行的构造方案中再添加一个字符有第二、三行两种方式,显然第三行的方式子序列更多。
因为第二行增加的是 $2 \times 1^8$,第三行增加的是 $2^2 \times 1^7$,即每增加一个字符增加子序列个数的为其他字符个数的乘积,所以每个字符的个数一定会如上表依次增大。
代码
C++
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
string s = "codeforces";
int main() {
ll k; cin >> k;
vector<int> cnt(10, 1);
ll tot = 1;
for (int loop = 2; tot < k; loop++) {
for (int j = 0; j < 10; j++) {
if (tot < k) {
tot = tot / cnt[j] * loop;
cnt[j] = loop; //同cnt[j]++
}
}
}
for (int i = 0; i < 10; i++)
cout << string(cnt[i], s[i]);
}
Python3
from functools import reduce s = "codeforces"
a = [0] * 10
k = int(input())
p = 0 while reduce(lambda x, y : x * y, a) < k:
a[p % 10] += 1;
p += 1 for i in range(10):
print(s[i] * a[i], end = "")
最新文章
- javascript 获取滚动条高度+常用js页面宽度与高度
- hash-3.hashCode
- 李洪强iOS经典面试题137-内存管理
- sysctl kernel parameter Optimization note
- 构造函数和:this()的应用
- canvas背景透明
- AFNETWORKING tabelView没有reloadData,报错unsupported URL
- C# 给自己的代码 添加上 自己的版权信息
- Servlet的请求HttpServletRequest
- EL表达式得不到后台传过来的值
- 设计模式之观察者(OBSERVER)模式
- 一、docker的原理
- WithOne 实体关系引起 EF Core 自动删除数据
- Sharepoint 2016 配置FBA(二) 编辑Web,config文件
- springboot源码解读01
- ArcEngine不同种类的工作空间建立查询ICursor时“超出系统资源”
- 洛谷 P4174 [NOI2006]最大获利 解题报告
- Button去除边框方法
- 用Thread类创建线程
- Android 监听屏幕唤醒和关闭的广播