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

    xiaoxiao2025-07-31  16

    题目链接: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; }
    最新回复(0)