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

description:

solution:

不妨设\(p_1\le p_2\)
首先\(lcm(p_1,p_2)\)一定会成为一个循环节,于是我们只用考虑一个循环节的情况就可以了
那么最坏的情况就是对于某个正整数\(m\),\([m*p_2+1,(m+1)*p_2-1]\)中间有最多的\(p_1\)的倍数

(这个图仅仅是为了方便理解,真正的情况下是不会出现这种情况的(毕竟这是\(p1=2,p2=6\)的情况啊,为什么会交错呢))
那么我们考虑最小化\(n*p_1-m*p_2其中m,n\in Z^*\),因为这样我们就可以在\([m*p_2+1,(m+1)*p_2-1]\)放下尽量多的\(p_1\)的倍数
根据裴蜀定理,\(min(n*p_1-m*p_2)=gcd(p_1,p_2)\)
于是我们就可以快速计算出这个位置,然后判断最多放多少个\(p_1\)的倍数,最后再和\(k\)比较就行了
不过似乎要特判\(p_1==p_2==k==1\)的情况,不判断好像可以直接挂成20分(好数据)

code:

#include<bits/stdc++.h>
using namespace std;
int t;
int p1,p2,k;
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&p1,&p2,&k);
		if(k==1){puts("No");continue;}
		int g=gcd(p1,p2);
		if(p1>p2)swap(p1,p2);
		if((p2-1-g)/p1+1<k)puts("Yes");
		else puts("No");
	}
	return 0;
}
posted @ 2020-10-20 11:28  BILL666  阅读(109)  评论(0编辑  收藏  举报