[NOI Online #2 提高组]涂色游戏 题解

题目描述

你有 1020 个格子,它们从 0 开始编号,初始时所有格子都还未染色,现在你按如下规则对它们染色:

  1. 编号是 p1 倍数的格子(包括 00号格子,下同)染成红色。
  2. 编号是 p2 倍数的格子染成蓝色。
  3. 编号既是 p1 倍数又是 p2 倍数的格子,你可以选择染成红色或者蓝色。

其中 p1 和 p2 是给定的整数,若格子编号是 p1 或 p2 的倍数则它必须要被染色。在忽略掉所有未染色格子后,你不希望存在 k个连续的格子颜色相同,因为你认为这种染色方案是无聊的。现在给定 p1, p2, k,你想知道是否有一种染色方案不是无聊的。

输入格式

本题包含多组数据。

第一行一个整数 T表示数据组数。

每组数据一行三个正整数p1, p2, k,变量意义见题目描述。

输出格式

对于每组数据,输出一行一个字符串,若存在一种染色方案不是无聊的,则输出 YES,否则输出 NO

选手程序输出结果与样例或题面中的一种格式相符即可,即不区分大小写。例如,如果标准答案为 YES ,则输出结果 YES/Yes/yes 都视为正确。

输入输出样例

输入 #1

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

输出 #1

No
Yes
Yes
Yes

输入 #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

输出 #2

Yes
Yes
Yes
No
No
No
Yes
Yes

说明/提示

测试点编号 p1, p2≤ k≤ T≤
1 ∼ 3 15 1515 3375
4 ∼ 6 10^3 10^3 10^4
7 ∼ 8 10^3 10^3 10
9 ∼ 10 10^5 10^3 10^3
11 ∼ 12 10^5 5*10^5 10
13 ∼ 14 10^5 5*10^5 10^5
15 10^9 10^9 10
16∼ 20 10^9 10^9 10^6

对于所有测试点1≤T≤106,1≤p1,p2,k≤109

分析

我们设p1、p2互质,且p1<p2

那么最坏的情况就是在[k\(\times\)p2+1,(k+1)\(\times\)p2-1]之间枚举p1的倍数

区间长度=p2-2,我们只要将\(\frac{p2-2}{p1}\)+1的值与k比较就可以了

需要注意两个细节

1、k=1时要特判,直接输出No

2、p1、p2有可能不互质,要除以它们的最大公因数

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
ll gcd(ll aa,ll bb){
    if(bb==0) return aa;
    return gcd(bb,aa%bb);
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        ll aa,bb,k;
        scanf("%lld%lld%lld",&aa,&bb,&k);
        ll gys=gcd(aa,bb);
        aa/=gys,bb/=gys;
        if(aa>bb) swap(aa,bb);
		if(k==1){
			printf("No\n");
			continue;
		}
        if(bb>2 && (bb-2)/aa+1>=k) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/liuchanglc/p/12790935.html
今日推荐