B. Plus and Multiply CodeForces - 1542B (思路,公式化简)

题目练级

题意

  1. 给我们两个数字 a、b,通过这个两个数字我们可以构造出来一个无穷元素的集合 S,
  2. 构造方法:1 最初在集合中,通过 1 和可以构造出 1a 与 1+b 在这个集合中,又因为 z=1a 在这个集合中,那么 z*a 与 z+b 也在这个集合中,…
  3. 现在问我们 n 这个元素是不是在 S 集合中

思路

  1. 其实如果 n 在 S 中的话,那么 n 一定可以被写成: n = a x + b ∗ y n = a^x + b*y n=ax+by, (其中 x,y 是恰当的数字),这个可以自己在纸上随便构造 S 中的元素,一定可以通过表达式化简写成:a^x + b*y 这样的形式,
  2. 如果我们枚举 a^x 话只需要判读 ( n − a x ) (n-a^x) % b (nax) 是不是等于 0 就可以了,如果是就是 yes,否则 no
  3. 真的是有些题,知识托着脑袋想是想不出来的,还是要在纸上多写写画画,才能出答案!!!

代码

#include <bits/stdc++.h>
using namespace std;
#define db  double
#define ll  long long
#define Pir pair<int, int>
#define fi  first
#define se  second
#define pb  push_back
#define m_p make_pair
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
/*==========ACMer===========*/
#define int ll
const int N = 2e5 + 10;
int a[N];


signed main()
{
    int T; scanf("%lld", &T);
    while (T --)
    {
        int n, a, b;
        scanf("%lld %lld %lld", &n, &a, &b);

        if (b == 1)
        {
            cout << "YES\n";
            continue;
        }
        if (a == 1)
        {
            if ((n - 1) % b == 0)
                cout <<"YES\n";
            else
                cout <<"NO\n";
            continue;
        }

        int flag = 0;
        for (ll i = 1; i <= n; i *= a)
        {
            if ((n - i) % b == 0)
            {
                flag = 1;
            }
        }

        if (flag)
            cout << "YES\n";
        else
            cout << "NO\n";
    }

    return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值