题目背景
1s 256M
题目描述
你有 1020个格子,它们从 0 开始编号,初始时所有格子都还未染色,现在你按如下规则对它们染色:
编号是 p1 倍数的格子(包括 00 号格子,下同)染成红色。
编号是 p 2倍数的格子染成蓝色。
编号既是 p1倍数又是 p 2倍数的格子,你可以选择染成红色或者蓝色。
其中 p1和 p2是给定的整数,若格子编号是 p1或 p2的倍数则它必须要被染色。在忽略掉所有未染色格子后,你不希望存在 kk 个连续的格子颜色相同,因为你认为这种染色方案是无聊的。现在给定 p1 , p2, k,你想知道是否有一种染色方案不是无聊的。
输入格式
本题包含多组数据。
第一行一个整数 T表示数据组数。
每组数据一行三个正整数 p1 , p2 , k,变量意义见题目描述。
输出格式
对于每组数据,输出一行一个字符串,若存在一种染色方案不是无聊的,则输出 YES,否则输出 NO。
选手程序输出结果与样例或题面中的一种格式相符即可,即不区分大小写。例如,如果标准答案为 YES ,则输出结果 YES/Yes/yes 都视为正确。
输入样例
4
2 10 4
2 3 6
1 4 7
1 1 2
输出样例
No
Yes
Yes
Yes
输入样例
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
输出样例
Yes
Yes
Yes
No
No
No
Yes
Yes
思路分析:
1.设p1<p2,且互质,如果不互质,两边除 gcd(p1,p 2) 即可,
则最坏的情况,也就是从 kp2+1 到 (k+1)p2-1这个连续串内塞 p1所对应的颜色,这样就有(p2-2)/p1+1 个连续块,将其与 k比较即可。
2.注意,当k=1时,无论怎么涂都是No!!!
C++代码如下:
#include <iostream>
using namespace std;
long long p1,p2,k,t;
long long gcd(long long a,long long b)
return !b?a:gcd(b,a%b);
int main()
{
cin>>t;
while (t--)
{
cin>>p1>>p2>>k;
if (k==1)
{
cout<<"NO"<<endl;
continue;
}
if (p1>p2)
swap(p1,p2);
long long x=gcd(p1,p2);
p1/=x;
p2/=x;
if(p2>2 && (p2-2)/p1+1>=k)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
子序列问题sequence(【CCF】NOI Online能力测试2 提高组第二题 )
游戏match(【CCF】NOI Online能力测试2 提高组第三题 )