【数论】[NOI Online #2 提高组]涂色游戏

L i n k Link Link

l u o g u   P 6476 luogu\ P6476 luogu P6476

D e s c r i p t i o n Description Description

在这里插入图片描述

S a m p l e Sample Sample I n p u t Input Input 1 1 1

4
2 10 4
2 3 6
1 4 7
1 1 2

S a m p l e Sample Sample O u t p u t Output Output 1 1 1

No
Yes
Yes
Yes

S a m p l e Sample Sample I n p u t Input Input 2 2 2

8
370359350 416913505 3
761592061 153246036 6
262185277 924417743 5
668232501 586472717 2
891054824 169842323 6
629603359 397927152 2
2614104 175031972 68
924509243 421614240 4

S a m p l e Sample Sample O u t p u t Output Output 2 2 2

Yes
Yes
Yes
No
No
No
Yes
Yes

H i n t Hint Hint

在这里插入图片描述

T r a i n Train Train o f of of T h o u g h t Thought Thought

一开始直接被 1 0 20 10^{20} 1020唬住,结果细看其实就是很多个 l c m ( p 1 , p 2 ) lcm(p1,p2) lcm(p1,p2)的循环组成而已
因此我们可以对一个循环求解从而得出答案
我们设 p 1 < p 2 p1 < p2 p1<p2(若题目不符合交换就可以了)
p1涂红色, p2涂蓝色
我们就以第一个循环, 0 − p 2 0 - p2 0p2来找规律
为了使得连续颜色的格子少一点,所以0是肯定涂蓝色的,然后我们看看从1开始,过 k − 1 k - 1 k1个倍数之后是否还在范围内,若还在范围内,则有 k k k个蓝色相连,即输出 N o No No, 若不在,就输出 Y e s Yes Yes

C o d e Code Code

#include<iostream>
#include<cstdio>
#define ll long long

using namespace std;

ll n, p1, p2, k, t;

ll gcd(ll x, ll y)
{return (!y) ? x : gcd(y, x % y);}

int main()
{
	scanf("%lld", &n);
	for (int i = 1; i <= n; ++i)
	{
		scanf("%lld%lld%lld", &p1, &p2, &k);
		if (k == 1) {
			printf("No\n");
			continue;
		} 
		if (p1 > p2) t = p1, p1 = p2, p2 = t;
		t = gcd(p1, p2);//求最大公约数,将数据缩小
		p1 /= t; p2 /= t;
		if (1 + p1 * (k - 1) < p2) printf("No\n");
		 else printf("Yes\n");
	}
	return 0;
} 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值