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
0−p2来找规律
为了使得连续颜色的格子少一点,所以0是肯定涂蓝色的,然后我们看看从1开始,过
k
−
1
k - 1
k−1个倍数之后是否还在范围内,若还在范围内,则有
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;
}