[题解] 洛谷 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见祖宗 :-)

洛谷博客

posted @ 2019-08-09 19:41  Biscuits_0819  阅读(208)  评论(0编辑  收藏  举报