PKU 2305 Basic remains

問題文: 2305 -- Basic remains

mが小さいことに注意する。一回mを十進数にしたものを得てから、それで余り取りながら基数変換する。

今さら気づいたんだけど基数変換ってもっとシンプルに書けるよな・・・。

#include <iostream>
using namespace std;
#define rep(i,n) for(int i = 0 ; i < n ; i++)

int to(string s,int b){
	int ans = 0; 
	int base = 1;
	rep(i,s.size()) ans += (s[s.size()-1-i] - '0') * base , base *= b; 
	return ans;
}
int ex_to(string s,int b,int d){
	int ans = 0; 
	int base = 1;
	rep(i,s.size()) ans = (ans+(s[s.size()-1-i] - '0') * base)%d , base = (base*b) % d; 
	return ans % d;
}
string from(int n,int b){
	if(n == 0) return "0";
	string s;
	while(n){
		s = string(1,'0'+n%b) + s;
		n /= b;
	}
	return s;
}
int main(){
	int b;
	string p,m;
	while(cin >> b >> p >> m ){
		cout << from ( ex_to( p , b , to(m,b) ) , b ) << endl;
	}
}