其他分享
首页 > 其他分享> > [题解] 洛谷 T73272 [LnOI2019SP]龟速单项式变换(SMT)

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

作者:互联网

题目描述

有如下定义:若正整数序列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见祖宗 :-)

标签:龟速,...,正整数,NO,题解,long,输出,序列,单项式
来源: https://www.cnblogs.com/Biscuits0819/p/11329243.html