P6130 随机红包

题目背景

出题人准备发一个微信红包给一些人,他很好奇如何随机分配里面的钱。

题目描述

出题人蒟蒻的红包里有着 $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$。

输出格式

共一行一个整数,表示所有询问的答案的异或和。

说明/提示

**【样例解释】** 第一个问题,$n=k=1$,答案是 $1$。 第二个问题,较大的数在 $[\dfrac{1}{2},1]$ 上均匀分布,期望为 $\dfrac{3}{4}$,取模后为 $249561089$。 第三个问题,较小的数在 $[0,\dfrac{1}{2}]$ 上均匀分布,期望为 $\dfrac{1}{4}$,取模后为 $748683265$。 异或和为 $574619649$。 ------ **【数据范围】** **本题采用捆绑测试**。 $\text{Subtask 1 (4 pts)}$:$n \le 10$,$k=1$。 $\text{Subtask 2 (16 pts)}$:$n \le 5 \times 10^3$。 $\text{Subtask 3 (20 pts)}$:$k=1$。 $\text{Subtask 4 (28 pts)}$:$n \le 10^5$。 $\text{Subtask 5 (32 pts)}$:没有任何额外限制。 对于 $100\%$ 的数据,$1 \le k \le n \le 10^7$,$1 \le T \le 2 \times 10^5$。