题目链接:https://ac.nowcoder.com/acm/contest/910/E
题目大意:

思路: 该题的大体意思是用w的0次方、w一次方……w n次方的砝码称出所给物体的重量,每个砝码都是唯一的不可重复使用。天平两侧都可放置砝码,以例一分析:要想称出7,需在7的那一侧放一个3,在天平另一侧放一个9和1,即可称出7的重量。

分析:该题可转化为一道w进制相关的题,模拟一下天平可得到如下式子:a0w0+a1*w1+……+anw^n=m,其中的a0-an均为0,1,-1(即该天平放在右侧),若满足条件即可判断。于是可以对式子进行逐次除以w后取余即可依次得到a0、a1等的值,由于取模不可能得到负值所以取模后的结果只能为0,1,w-1,这一点理解较困难,举例:若w=5,天平左侧放物体,右侧放砝码,若左侧放了一个5的砝码,那么整理式子至式子一端为m时,a1应为-1,但不满足运算法则,所以5的高次即5的平方次a2需要降一位给低位,那么a1的即为w-1=4,反过来求取a2的时候需要加一后取余。这一点相当于先将左侧的砝码拿走后又将左侧砝码加上。理解这一点不难写出代码。重复过程直至被除数为0或者存在不符合情况的余数输出NO即可。以上为解题分析。

测试中可以发现w等于1、2、3此题中可以构成任何数。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod = 332748118;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int w, m;
        scanf("%d%d",&w,&m);
        if(w<=3)
        {
            printf("YES\n");
        }
        else
        {
            int flog=0;
            while(m)
            {
                int x=m%w;
                if(x==0||x==1)
                {
                    m/=w;
                }
                else if(x==w-1)
                {
                    m=m/w+1;
                }
                else
                {
                    flog=1;
                    break;
                }
            }
            if(flog)
            {
                printf("NO\n");
            }
            else
            {
                printf("YES\n");
            }
        }
    }

    return 0;
}