题目背景
出题人准备发一个微信红包给一些人,他很好奇如何随机分配里面的钱。
题目描述
出题人蒟蒻的红包里有着 1 块钱,他要把这块钱随机分给 n 个人。
为了随机,他设计了以下算法进行分配:(用伪代码表示)
a[0]=0,a[n]=1
for i=1 to n-1 do{
a[i]=rand()
}
sort(a)
for i=1 to n do{
money[i]=a[i]-a[i-1]
}
这里的 rand()
函数会等概率随机返回一个 [0,1] 之间的实数值,sort()
函数会将一个数组从小到大排序。
现在,出题人蒟蒻很好奇得到钱数第 k 少的人得到的钱的期望。
由于他要根据这个值去推算他要发多少个红包,所以他要问你 T 次。
为了避免精度丢失,答案对 998244353 取模。
为了避免输出量过大,输出所有答案的异或和。
输入格式
本题有多组数据。
第一行为整数 T,表示数据组数。
对于每组数据,一行两个整数 n,k。
输出格式
共一行一个整数,表示所有询问的答案的异或和。
3
1 1
2 2
2 1
574619649
提示
【样例解释】
第一个问题,n=k=1,答案是 1。
第二个问题,较大的数在 [21,1] 上均匀分布,期望为 43,取模后为 249561089。
第三个问题,较小的数在 [0,21] 上均匀分布,期望为 41,取模后为 748683265。
异或和为 574619649。
【数据范围】
本题采用捆绑测试。
Subtask 1 (4 pts):n≤10,k=1。
Subtask 2 (16 pts):n≤5×103。
Subtask 3 (20 pts):k=1。
Subtask 4 (28 pts):n≤105。
Subtask 5 (32 pts):没有任何额外限制。
对于 100% 的数据,1≤k≤n≤107,1≤T≤2×105。