前言
呦呵,这道题我竟然爆零了
而且我的暴力dfs死循环了! \bold{\Large\xcancel\text{而且我的暴力dfs死循环了!}} 而且我的暴力dfs死循环了!
而且直到结束也没调出来 \bold{\Large\xcancel\text{\small 而且直到结束也没调出来}} 而且直到结束也没调出来
呦呵,代码我还找不着了……
还是来做一百分的吧。
题目
解析
首先说明一下,我刚刚发现CCF用的编译器是C++
,而不是C++11
然后我同学就因为没加#include<cstdio>
爆零了
还是要加#include<bits/stdc++/h>
呀
不妨设 p 1 < p 2 p_1<p_2 p1<p2,且 p 1 , p 2 p_1,p_2 p1,p2互质
则会发现:最坏情况,也就是从 k p 2 + 1 kp_2+1 kp2+1到 ( k + 1 ) p 2 − 1 (k+1)p_2-1 (k+1)p2−1这个连续串内塞 p 1 p_1 p1所对应的颜色。
这样就有 p 2 − 2 p 1 + 1 \dfrac{p_2-2}{p_1}+1 p1p2−2+1个连续块,将其与 k k k比较即可。
还要记住一点:因为两边可能不互质,所以可以将两边都除以 g c d ( p 1 , p 2 ) gcd(p_1,p_2) gcd(p1,p2)即可。
至于gcd的代码:
inline int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
代码
#include<bits/stdc++.h>
using namespace std;
inline int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int p1,p2,k;
scanf("%d%d%d",&p1,&p2,&k);
if(k==1)
{
puts("NO");
continue;
}
if(p1>p2)
swap(p1,p2);
int tmp=gcd(p1,p2);
p1/=tmp;
p2/=tmp;
puts((p2>2 && (p2-2)/p1+1>=k)?"NO":"YES");
}
return 0;
}