思路
一个比较明显的结论是,不同的数字个数只可能是 1 , 2 , 3 1,2,3 1,2,3。
可以随手写一个暴力的输出程序,假定 n n n 和 m m m,把所有可能的序列都输出来,就可以发现这个规律。
也可以感性思考一下。
如果第 n + 1 n+1 n+1 位是 0 0 0,那么整个序列都会是 0 0 0,个数也就是 1 1 1。
如果第 n + 1 n+1 n+1 位是一个小于 n n n 的数 x 0 x_0 x0,那么就会重复若干次 x 0 x_0 x0,在第 x 0 x_0 x0 位开始变为 0 0 0,所以这种情况的个数是 2 2 2。
如果第 n + 1 n+1 n+1 位是一个 n n n 的倍数 x 1 x_1 x1,那么只会出现一次 x 1 x_1 x1,此后都是 0 0 0,这种情况的个数也是 2 2 2。
其他情况就是不是 n n n 的倍数并且大于 n n n 的情况,假设填的是 x 2 x_2 x2,那么第 n + 1 n+1 n+1 位是 x 2 x_2 x2,第 n n n 位就是 x 2 m o d n x_2 \bmod n x2modn,重复若干次后直到遇到第 x 2 m o d n x_2 \bmod n x2modn 位,就会变为 0 0 0,因为 x 2 x_2 x2 不是 n n n 的倍数,所以一定会有三个不同的数字。
所以如果要求的数量大于 3 3 3 就无解,即为 0 0 0。
如果要求的数量是 1 1 1,只有一种情况。
如果要求的数量是 2 2 2,情况数就是 n − 1 + ⌊ m n ⌋ n-1+\lfloor \frac m n\rfloor n−1+⌊nm⌋。
如果要求的数量是 3 3 3,情况数就是 m + 1 − 1 − ( n − 1 + ⌊ m n ⌋ ) = m − n + 1 + ⌊ m n ⌋ m+1-1-(n-1+\lfloor \frac m n\rfloor)=m-n+1+\lfloor \frac m n \rfloor m+1−1−(n−1+⌊nm⌋)=m−n+1+⌊nm⌋。
需要注意 m < n m<n m<n 的情况,这种情况时,数量为 2 2 2 的答案就是 m m m,数量为 3 3 3 的答案是 0 0 0。
AC code
#include<bits/stdc++.h>
using namespace std;
long long T,a,b,c;
int main()
{
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld%lld",&a,&b,&c);
if(c>3) puts("0");
else
{
if(c==1) puts("1");
else if(c==2) printf("%lld\n",min(b,a-1+b/a));
else printf("%lld\n",max(0ll,b-a+1-b/a));
}
}
return 0;
}