嘘~ 正在从服务器偷取页面 . . .

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


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

题目链接:P5497 [LnOI2019SP] 龟速单项式变换(SMT)

题意

若正整数序列 \(a\) 中存在连续若干个正整数的和为 \(m\) 的倍数,则这个正整数序列 \(a\) 被称为“\(m\) 序列”。

给定 \(n\)\(m\),你需要知道长度为 \(n\) 的任意正整数序列 \(a\) 是否都是“\(m\) 序列”。

输入格式

两个数,\(n\)\(m\)

输出格式

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

数据范围

\(1 \le n, m \le {10}^{18}\)

显然 \(n < m\) 时构造 \([1,1,\cdots,1]\) 即可。

\(n \ge m\) 时,记 \(S_i = \sum_{1 \le j \le i}a_j\) ,则至少存在一对 \((l,r)\) 满足 \(S_l\equiv S_r\pmod{m}\)

又因为他们的差一定不为 \(0\) ,则区间 \([l+1,r]\) 的和是 \(m\) 的倍数,即 \(n \ge m\)​ 时不存在非法构造。

因此这道题只需要判断一下 \(n,m\) 的大小关系即可。

时间复杂度 \(\mathcal{O}(1)\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x,int y) { x < y ? x = y : 0; }
void down(int &x,int y) { x > y ? x = y : 0; }
#define N ((int)())

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    int n, m; cin >> n >> m;
    cout << (n >= m ? "YES" : "NO") << '\n';
    return 0;
}

文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录