P9034 「KDOI-04」Again Counting Set

题目背景

题目描述

小 S 不喜欢集合,不喜欢自然数,不喜欢求和,不喜欢求积,不喜欢最小值,不喜欢最大值,不喜欢 mex⁡\operatorname{mex}mex,所以有了这题。

给出 n,kn,kn,k,求有多少个可重整数集合 SSS 满足:

  • ∣S∣=k|S|=kS=k
  • 对于任意 x∈Sx\in SxS0≤x≤n0\le x\le n0xn
  • ∏x∈Sx=min⁡x∈Sx\displaystyle{\prod_{x\in S} x=\min_{x\in S} x}xSx=xSminx
  • ∑x∈Sx=min⁡x∈Sx+max⁡x∈Sx+mex⁡(S)\displaystyle{\sum_{x\in S} x=\min_{x\in S} x+\max_{x\in S}x+{\operatorname{mex}}(S)}xSx=xSminx+xSmaxx+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^61T1061≤n,k≤10181\le n,k\le10^{18}1n,k1018

测试点编号 分值 T≤T\leT k≤k\lek nnn
111 101010 555 555 ≤5\le55
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\le1010
888 101010 10510^5105 10310^3103 ≤103\le10^3103
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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐