题目:对于数组 $\{a_1,a_2,\dots,a_n\}$ ,我们定义它是好的,当且仅当:对于全部的 $i \in [1,n)$ ,$a_i = a_{i+1} \bmod i$ 总是成立;
$\,\,\,\,\,\,\,\,\,$现在,你可以选择 $n$ 个整数组成一个数组,使得这个数组是好的;同时,你还需要保证:
$\,\,\,\,\,\,\,\,\,\,\,\,\,\,\bullet\,$数组中至少存在 $m$ 个不同的数字;
$\,\,\,\,\,\,\,\,\,\,\,\,\,\,\bullet\,$数组中的每一个数字都满足 $\in [0,n]$ 。
$\,\,\,\,\,\,\,\,\,$在这里, $\bmod$ 代表取模。
输入:$\,\,\,\,\,\,\,\,\,$每个测试文件均包含多组测试数据。第一行输入一个整数 $T\left(1\le T\le 10^5\right)$ 代表数据组数,每组测试数据描述如下:
$\,\,\,\,\,\,\,\,\,$在一行上输入两个整数 $n,m \left( 1\le m \le n \le 10^7\right)$ 代表你需要挑选的数字数量、不相同数字个数的限制。
输出: $\,\,\,\,\,\,\,\,\,$对于每一组测试数据,在一行上输出一个整数,代表满足条件的数组数量。
思路:模拟几遍之后发现m <= 3时才有符合条件的数组,并且:
当m = 3时:满足条件的只有第一个数是0,最后一个数是n,中间的数是1的情况
当m = 2时:满足条件的除了满足m = 3的情况外
,还有n - 1种情况
(例:n = 5,满足条件的数组有{0,1,1,1,1,}、{0,0,2,2,2}、{0,0,0,3,3}、{0,0,0,0,4}共4种情况
当m = 1时,满足条件的除了m = 3和m = 2的情况外
,还有全为0的情况
#include <iostream>
using namespace std;
int main()
{
int T;
scanf("%d", &T);
while (T -- )
{
int n, m;
scanf("%d%d", &n, &m);
if (m > 3)
{
printf("0\n");
continue;
}
int ans = 0;
if (m <= 3) ans ++;
if (m <= 2) ans += n - 1;
if (m <= 1) ans ++;
cout << ans << endl;
}
return 0;
}