CF1877C Joyboard

去洛谷看我的博客

思路

一个比较明显的结论是,不同的数字个数只可能是 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 n1+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+11(n1+nm⌋)=mn+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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值