読者です 読者をやめる 読者になる 読者になる

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;
	}
}