中南林业科技大学第十一届程序设计大赛 E 砝码和天平 m转化成w进制

题目链接: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值