abc202D aab aba baa
由x个a和y个b构成长度为x+y的字符串,求字典序第k小的那个串。
1<=x,y<=30; 保证k有效。
思路:x个a和y个b能构成的不同字符串有
#include <bits/stdc++.h> using i64 = long long; std::vector<int> minp, prime; void sieve(int n) { minp.assign(n + 1, 0); prime.clear(); for (int i = 2; i <= n; i++) { if (minp[i] == 0) { minp[i] = i; prime.push_back(i); for (int j = 2 * i; j <= n; j += i) { if (minp[j] == 0) { minp[j] = i; } } } } } std::map<int,int> factorial(int x) { std::map<int,int> mp; for (int i = 2; i <= x; i++) { for (int j = i; minp[j] > 1; j /= minp[j]) mp[minp[j]] += 1; } return mp; } i64 f(int x, int y) { std::map<int,int> mp = factorial(x + y); for (auto [k, v] : factorial(x)) { mp[k] -= v; } for (auto [k, v] : factorial(y)) { mp[k] -= v; } i64 ans = 1; for (auto [k, v] : mp) { for (int i = 1; i <= v; i++) { ans *= k; } } return ans; } void solve() { int a, b; i64 k; std::cin >> a >> b >> k; int cnt = a + b; for (int i = 1; i <= cnt; i++) { if (a > 0 && k <= f(a - 1, b)) { std::cout << 'a'; a -= 1; } else { std::cout << 'b'; k -= f(a - 1, b); b -= 1; } } } int main() { sieve(60); std::cin.tie(0)->sync_with_stdio(0); int t = 1; while (t--) solve(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)