ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-08-09 19:56:02  阅读:142  来源: 互联网

标签:龟速 ... 正整数 NO 题解 long 输出 序列 单项式


题目描述

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有