NY10B - Nim-B Sum

· · 题解

先看题目

吐槽一下翻译的什么玩意。原题面简直比翻译体面好理解一百倍。我甚至几次翻题解都是为了弄明白题目啥意思……

翻译中所指的异或运算其实就是每一位都取两数之和再取余 $b$。 下面是当 $(x)b$ 为 $512$,$(y)b$ 为 $325$,$b$ 为 $6$ 时的图解: $~~~~~5~~1~~2 \oplus~~3~~2~~5 ——————— ~~~~~2~~3~~1 $3$ 为 $(1+2)\bmod 6$ 得来。 $1$ 为 $(5+2)\bmod 6$ 得来。 最后输出 $p$ 再输出得出答案的 $10$ 进制结果便可以了(注意多组数据)。 ## 再想思路 模拟,纯纯的模拟。 1. 把 $x$ 和 $y$ 转化成 $b$ 进制,函数如下: ```cpp string to_b(int a){ string ans;//这里用字符串存储会省事很多,具体请自行体会。 while(a){ ans+='0'+(a%b); a/=b; } return ans; }//注意这里的结果是倒的,但这正好方便我们在后续把它转化成10进制。 ``` 2. 做异或运算: ```cpp bx=to_b(x); by=to_b(y); if(by.size()>bx.size()) swap(by,bx); for(int i=0;i<by.size();i++){ bx[i]=((bx[i]-'0'+by[i]-'0')%b)+'0';//具体见上图解。 }//注意这里的结果还是倒的 ``` 3. 把得到的结果转化为 $10$ 进制并输出,忘记了的话可以[搜一下](https://zhidao.baidu.com/question/263880553995987725.html#:~:text=N%E8%BF%9B%E5%88%B6%E8%BD%AC%E5%8D%81%E8%BF%9B%E5%88%B6%E7%9A%84,%E6%98%AF%EF%BC%9A%E6%8C%89%E6%9D%83%E7%9B%B8%E5%8A%A0%E6%B3%95%E3%80%82)。 ```cpp int Pow=1,ans=0; for(int i=0;i<bx.size();i++){ ans+=(Pow*(bx[i]-'0')); Pow*=b; } cout<<p<<' '<<ans<<endl; ``` 就这样,我们华丽解决了这道题。 ## 完整代码 ```cpp #include<iostream> using namespace std; int t,p,b,x,y; string bx,by; string to_b(int a){ string ans; while(a){ ans+='0'+(a%b); a/=b; } return ans; } int main(){ cin>>t; while(t--){ cin>>p>>b>>x>>y; bx=to_b(x); by=to_b(y); if(by.size()>bx.size())swap(by,bx); for(int i=0;i<by.size();i++){ bx[i]=((bx[i]-'0'+by[i]-'0')%b)+'0'; } int Pow=1,ans=0; for(int i=0;i<bx.size();i++){ ans+=(Pow*(bx[i]-'0')); Pow*=b; } cout<<p<<' '<<ans<<endl; } } ```