[题解] 洛谷 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