NY10B - Nim-B Sum
_xEr_
·
·
题解
先看题目
吐槽一下翻译的什么玩意。原题面简直比翻译体面好理解一百倍。我甚至几次翻题解都是为了弄明白题目啥意思……
翻译中所指的异或运算其实就是每一位都取两数之和再取余 $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;
}
}
```