打卡信奥刷题(3297)用C++实现信奥题 P9034 「KDOI-04」Again Counting Set
P9034 「KDOI-04」Again Counting Set
题目背景

题目描述
小 S 不喜欢集合,不喜欢自然数,不喜欢求和,不喜欢求积,不喜欢最小值,不喜欢最大值,不喜欢 mex\operatorname{mex}mex,所以有了这题。
给出 n,kn,kn,k,求有多少个可重整数集合 SSS 满足:
- ∣S∣=k|S|=k∣S∣=k;
- 对于任意 x∈Sx\in Sx∈S,0≤x≤n0\le x\le n0≤x≤n;
- ∏x∈Sx=minx∈Sx\displaystyle{\prod_{x\in S} x=\min_{x\in S} x}x∈S∏x=x∈Sminx;
- ∑x∈Sx=minx∈Sx+maxx∈Sx+mex(S)\displaystyle{\sum_{x\in S} x=\min_{x\in S} x+\max_{x\in S}x+{\operatorname{mex}}(S)}x∈S∑x=x∈Sminx+x∈Smaxx+mex(S)。
注: mex\bf{mex}mex 指集合中没有出现过的最小的自然数。
输入格式
本题包含多组测试数据。
输入的第一行包含一个正整数 TTT,表示测试数据组数。
对于每组测试数据,输入包含一行两个正整数 n,kn,kn,k。
输出格式
对于每组测试数据,输出一行一个整数表示答案。
输入输出样例 #1
输入 #1
7
1 4
2 4
5 3
2 100
3 8
20 50
499122178 4
输出 #1
1
2
0
3
5
39
998244353
说明/提示
【补充说明】
为了更好的让选手理解题面,给出若干合法/不合法集合例子:
- {0,1,2,2}\{0,1,2,2\}{0,1,2,2}。
该集合是一个符合要求的集合,因为 0×1×2×2=0=min{0,1,2,2}0\times 1\times 2\times 2=0=\min\{0,1,2,2\}0×1×2×2=0=min{0,1,2,2},0+1+2+2=5,min{0,1,2,2}+max{0,1,2,2}+mex{0,1,2,2}=0+2+3=50+1+2+2=5,\min\{0,1,2,2\}+\max\{0,1,2,2\}+\operatorname{mex}\{0,1,2,2\}=0+2+3=50+1+2+2=5,min{0,1,2,2}+max{0,1,2,2}+mex{0,1,2,2}=0+2+3=5。
- {3,5}\{3,5\}{3,5}
该集合不是一个符合要求的集合,因为虽然 3+5=8,min{3,5}+max{3,5}+mex{3,5}=3+5+0=83+5=8,\min\{3,5\}+\max\{3,5\}+\operatorname{mex}\{3,5\}=3+5+0=83+5=8,min{3,5}+max{3,5}+mex{3,5}=3+5+0=8,但是 3×5≠min{3,5}3\times 5\not=\min\{3,5\}3×5=min{3,5}。
- {1,9,1,9,8,1,0}\{1,9,1,9,8,1,0\}{1,9,1,9,8,1,0}。
该集合不是一个符合要求的集合,因为虽然 1×9×1×9×8×1×0=0=min{1,9,1,9,8,1,0}1\times 9\times 1\times 9\times 8\times 1\times 0=0=\min\{1,9,1,9,8,1,0\}1×9×1×9×8×1×0=0=min{1,9,1,9,8,1,0},但是其和为 292929 而并非 min+max+mex=0+9+2=11\min+\max+\operatorname{mex}=0+9+2=11min+max+mex=0+9+2=11。
【数据范围】
对于 100%100\%100% 的数据,保证 1≤T≤1061\le T\le10^61≤T≤106,1≤n,k≤10181\le n,k\le10^{18}1≤n,k≤1018。
| 测试点编号 | 分值 | T≤T\leT≤ | k≤k\lek≤ | nnn |
|---|---|---|---|---|
| 111 | 101010 | 555 | 555 | ≤5\le5≤5 |
| 222 | 101010 | 10510^5105 | 101810^{18}1018 | =1=1=1 |
| 333 | 101010 | 10510^5105 | 101810^{18}1018 | =2=2=2 |
| 444 | 101010 | 10510^5105 | 101810^{18}1018 | =3=3=3 |
| 555 | 101010 | 10510^5105 | 101810^{18}1018 | =4=4=4 |
| 666 | 101010 | 10510^5105 | 101810^{18}1018 | =5=5=5 |
| 777 | 101010 | 10510^5105 | 101010 | ≤10\le10≤10 |
| 888 | 101010 | 10510^5105 | 10310^3103 | ≤103\le10^3≤103 |
| 999 | 101010 | 10610^6106 | 101810^{18}1018 | ≤108\le10^{8}≤108 |
| 101010 | 101010 | 10610^6106 | 101810^{18}1018 | ≤1018\le10^{18}≤1018 |
C++实现
#include <bits/stdc++.h>
using namespace std;
long long n, k;
long long solve() {
cin >> n >> k;
if(k == 1) return 0;
long long ans = 0;
if(k >= 4) {
ans += 1 + max(0ll, n - 2);
if(n >= 2) ans += 1 + max(0ll, n - 3);
}
if(k >= 5) {
if(n >= 2) ans++;
if(n >= 3) ans++;
}
if(k == 2) ans++;
return ans;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while(T--) cout << solve() << "\n";
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)