题解 | #现在是消消乐时间#

现在是消消乐时间

https://ac.nowcoder.com/acm/contest/75771/F

F 现在是消消乐时间

题解

注意到小球的运动轨迹只有两种:从矩形的四个角之一射出,或者回到发射点进入循环。

接下来对两种情况分别讨论:

1.从某个角射出

令小球的初始位置为 ,射出时间为 ,则 为满足如下同余方程的最小正整数:

注意到方程的答案不超过 ,而当 取矩形的四个角时取得最大值 ,即

我们将网格线的交点按棋盘方式黑白染色,由于小球只能斜向移动,因此小球只能在同色点之间移动。

同时,一个方块恰好由一对同色点相连接,且每条边最多只被经过一次(经过两次即说明小球在出口处反弹),因此小球在 的时间内恰好能消除 个方块。

若想消除所有方块则有 ,解得

时由裴蜀定理可知方程一定有解,故此时射入的小球一定会射出,且在矩形四个角射入的小球恰好能消除所有方块。

2.回到起点

令小球第一次回到起点的时间为 ,则 为满足如下同余方程的最小正整数:

解得 ,即

注意到此时小球在有向环上移动,因此在返回起点前最多经过每条边一次,即小球在 的时间内同样能消除 个方块。

若想消除所有方块则有 ,解得

时所有能够进入循环的起点均满足条件,这样的点满足颜色与矩形的四个角相异。

3.结论

综上,我们得出结论:

  1. 时,任意位置均可;
  2. 时,从矩形的四个角射入;
  3. 时,任意坐标和不为偶数的位置均可;
  4. 时,输出 NO。

Bonus:令 为一次发射能清除方块的最大值,求

代码

#include<cstdio>
#include<numeric>

int n,m,d,k;

int main(){
	scanf("%d%d%d",&n,&m,&d);
	k=std::gcd(n,m);
	if(d==n||k==1)printf("YES\n0 0\nUR");
	else if(k==2)printf("YES\n0 1\nUL");
	else puts("NO");
}
全部评论
啊?
点赞 回复 分享
发布于 2024-07-01 23:45 江苏
啊?
点赞 回复 分享
发布于 2024-06-03 13:20 浙江

相关推荐

下北泽:都是校友,还是同届,我就说直白点,不委婉了,我相信你应该也不是个玻璃心,首先你觉得一个双非的绩点写简历上有用吗?班长职务有用吗?ccf有用吗?企业会关心你高数满分与否吗?第二,第一个项目实在太烂,一眼就能看出是外卖,还是毫无包装的外卖,使用JWT来鉴权,把热点数据放进Redis这两个点居然还能写进简历里,说难听点这两个东西都是学个几十分钟,调用个API就能完成的事情,在双非一本的条件下,这种项目你觉得能拿出手吗,第二个项目你写的东西和你的求职方向有任何的匹配吗?第三,计设那一块毫无价值,如果想突出自己会前端,直接写入专业技能不行吗,最后,专业技能里像深入理解JVM底层原理这种你觉得这句话你自己真的能匹配吗?都是校友加上同届,我措辞直接,但希望能点出你的问题,想进大厂还得继续沉淀项目和学习
点赞 评论 收藏
分享
评论
11
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务