NOI Online2 提高组 涂色游戏 题解

题目传送门

题目大意: 有一个无限长的序列,多组询问,每次给出 n , m , k n,m,k n,m,k,将这个序列的 n , 2 n , 3 n , . . . n,2n,3n,... n,2n,3n,... 染成红色, m , 2 m , 3 m , . . . m,2m,3m,... m,2m,3m,... 染成蓝色, n , m n,m n,m 的公倍数位置可红可蓝,忽略无色格子,问是否存在一种染色方案使得不存在连续 k k k 个相同颜色的格子。

题解

显然我们只需要考虑 0 0 0 ~ l c m ( n , m ) lcm(n,m) lcm(n,m) 这一段,因为后面的情况都是一样的。

假设 n < m n<m n<m,那么红色多于蓝色,公倍数位置染蓝色就更优。那么就是要找哪两个蓝色格子中间红色格子最多。

如果第一个红色格子贴着左边的蓝色放,那么一定能放最多,考虑让 n , m n,m n,m 除以他们的最大公倍数,那么就是要找到一个解,满足 a n − b m = 1 an-bm=1 anbm=1,由于此时 n , m n,m n,m 互质,所以一定存在这样的解。

那么不算左边贴着放的那个红色格子,剩下还有 m − 2 m-2 m2 个格子,除一下 n n n 算一下最多能染几个红色格子,然后再加上左边那个,最后和 k k k 比一下就好了。

还有一些特判,具体就看代码吧:

#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long

int T,k;ll n,m;
ll _gcd(ll x,ll y){return !y?x:_gcd(y,x%y);}

int main()
{
	scanf("%d",&T);while(T--)
	{
		scanf("%lld %lld %d",&n,&m,&k);
		if(k==1){printf("No\n");continue;}//怎么放都不可能
		if(n==m){printf("Yes\n");continue;}//红蓝轮流染,就不会超过一个连续颜色
		ll gcd=_gcd(n,m);n/=gcd,m/=gcd;if(n<m)swap(n,m);
		if((n-2)/m+1>=k)printf("No\n");else printf("Yes\n");
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值