CF1542B Plus and Multiply

CF1542B Plus and Multiply - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

T={ax+yb  x,yN}T = \{a^x +yb \text{ } \vert \text{ } x, y \in N\}SS 相等。

证明:

  • STS \subseteq T:显然有 1T1 \in T。然后有 (ax+yb)×a=ax+1+(ay)b(a^x+yb) \times a = a^{x+1} + (ay)b(ax+yb)+b=ax+1+(y+1)b(a^x + yb) + b = a^{x+1} + (y+1)b
  • TST \subseteq Sax+yba^x + yb 可以由 11xxaa 再加 yybb 得到。

因此 S=TS = T

那么问题可以转化为 nn 是否可以表示为 ax+yba^x + yb,其中 x,yNx, y \in N

容易发现当 a1a \ne 1 时,xx 的范围很小。枚举 xx 即可。然后检验 yy 是否为 naxn - a^x 的因数。

a=1a = 1 时容易特判:只需要检验 n modb=1n \bmod b = 1b=1b = 1 即可(注意 X mod1=0X \bmod 1 = 0)。

单组数据 O(logn)\mathcal{O}(\log n)

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2022-10-14 01:41:35 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2022-10-14 01:52:57
 */

#include <bits/stdc++.h>
#define int long long

inline int read() {
    int x = 0;
    bool flag = true;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-')
            flag = false;
        ch = getchar();
    }
    while (isdigit(ch)) {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    if(flag)
        return x;
    return ~(x - 1);
}

signed main() {
    int T = read();
    while (T--) {
        int n = read(), a = read(), b = read();
        if (a == 1) {
            if (b == 1 || n % b == 1)
                puts("Yes");
            else
                puts("No");
            continue;
        }

        bool fl = false;
        for (int X = 1; X <= n; X *= a) {
            if ((n - X) % b == 0) {
                fl = true;
                break;
            }
        }

        puts(fl ? "Yes" : "No");
    }
    return 0;
}
posted @   dbxxx  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示