[题解] 洛谷 T73272 [LnOI2019SP]龟速单项式变换(SMT)

题目链接

顺便我好像理解错题意了,不过思路是对的,题目也A了,辛苦打了半天不忍心删了2333。真正的题解

题目描述

有如下定义:若正整数序列a中存在连续若干个正整数的和为m的倍数,则这个正整数序列a被称为“司m序列”。

给定n和m,你需要知道长度为n的任意正整数序列a是否都是"司m序列"。

输入格式

一行两个整数n,m

输出格式

如果成立输出YES,否则输出NO

输入样例

2 4

输出样例

NO

数据范围

1<=n,m<=10^18

 

思路解析

首先我们设一个长为n的序列,最中间的数为x,那么:

如果n是奇数,序列为:

... x-2 , x-1 , x , x+1 , x+2 ...

序列总和为:n*x

如果n是偶数,序列为:

...x-1 , x , x+1 , x+2 ...

序列总和为:n*x+1

我们的任务是证明:

y*m = n*x 或 y*m = n*x+1 恒成立  (x,y为任意整数)

那么,我们假设 y*m = n*x,

那么y*m+n=n*(x+1)

我们设 t = x+1

于是式子变成了:y*m+n = n*t (t为任意整数)

因为 y*m = n*x = n*t ,所以 y*m+n 也得是m的倍数。

所以n为m的倍数。

同理可证 y*m = n*x + 1.

然后对于本题,是要求是否存在任意一个 l*x = y*m ,( l<=n)

所以只要n>=m,那么就至少存在一个l=m,使得 l*x = y*m,输出YES

否则输出 NO

代码非常简单了:

#include<bits/stdc++.h>
using namespace std;
long long int n,m;
int main(){
  scanf("%lld%lld",&n,&m);
  if(n>=m)
    printf("YES");
  else
    printf("NO");
  return 0;
}

最后,十年OI一场空,不开long long见祖宗 :-)

洛谷博客

转载于:https://www.cnblogs.com/Biscuits0819/p/11329243.html

题目 P5413 "YNOI2019 骑单车" 是一个经典的动态规划和贪心算法的问题。该题主要涉及两个概念:路径规划和状态转移方程。 **背景描述** 假设你在一个二维网格上,每个单元格代表一个地点,你需要从起点出发骑车到终点,并尽可能地减少骑行时间。网格中的每个单元格都有两种可能的状态:平地(速度不变)或斜坡(速度减半)。你的目标是找到一条最短的路线。 **关键点解析** 1. **动态规划**:通常用于求解最优化问题。在这个问题中,我们可以定义一个二维数组 dp[i][j] 表示从起点到位置 (i, j) 的最短行驶时间。状态转移方程会根据当前位置的性质(平地还是斜坡)以及到达此位置的最短路径来自之前的节点计算。 2. **状态转移**:对于平地,dp[i][j] = dp[pi][pj] + cost,表示直接移动到相邻位置的时间;对于斜坡,dp[i][j] = min(dp[pi][pj], dp[pi][pj-1]) + cost/2,因为斜坡速度减半,所以需要选择更早的时刻经过。 3. **贪心策略**:有时候,为了达到全局最优,初始看起来不是最优的选择可能是正确的。但在这个问题中,贪心策略可能并不适用,因为我们不能仅依据当前状态做出决策,需要考虑到整个路径。 4. **边界条件**:初始化 dp 数组时,起点时间设为 0,其余位置设为正无穷大,保证一开始就只会向可达的位置移动。 **代码实现** 实现这样的动态规划算法通常需要用到一个优先队列(如最小堆),以便于高效地查找之前节点的最优时间。 **相关问题--:** 1. 如何设计状态转移方程来处理平地和斜坡的情况? 2. 这个问题是否存在剪枝操作以提高效率? 3. 如果网格大小非常大,如何避免存储所有 dp 值导致的空间爆炸?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值