CF1542B Plus and Multiply 题解

分析

等价于判断 \(n\) 能否写成如下形式 \[ n = a^x + by \] 多乘个 \(a\) 或者多加个 \(b\) 仍然形如这样。

这就相当于 \[ n \equiv a^x \quad (\bmod b) \] 因为 \(y\) 是个未知数,可以利用这个转化同余方程。或者说,\(x \equiv y \quad (\bmod b) \iff b \mid (x-y)\)。注意这里的 \(x,y,b\) 是任意的。

这个就很简单了,枚举 \(x\),满足 \(a^x \in [1,n]\),判断 \(a^x \bmod b\) 是否等于 \(n \bmod b\)

为什么只用枚举使得 \(a^x \in [1,n]\)\(x\)?因为 \(a,b \in \mathbb{Z^+}\),那么如果 \(a^x\) 大于 \(n\) 的话,就不可能了。

注意特判,当 \(a=1\) 时,等价于 \(n \equiv 1 \quad (\bmod b)\),如果成立的话,有两种情况。第一种可以直接判断 \(n \bmod b\) 是否为 1,第二种,如果 \(b=1\),那么 \(n\) 为任何数时都成立。其他情况都无解。

CODE

#include<bits/stdc++.h>
using namespace std;
#define ll long long
long long T, n, a, b;
void solve() {
    scanf("%lld%lld%lld",&n,&a,&b);
    if(a==1) {
        if(n%b==1||b==1) puts("Yes");
        else puts("No");
        return;
    }
    int y=n%b;
    for(ll x=1;x<=n;x*=a) {
        if(x%b==y) { puts("Yes"); return; }
    }
    puts("No");
}
int main() {
    scanf("%lld",&T);
    while(T--) solve();
}

CF1542B Plus and Multiply 题解
https://yozora0908.github.io/2022/cf1542b-solution/
作者
yozora0908
发布于
2022年7月1日
许可协议