순간을 성실히, 화려함보단 꾸준함을

[ boj : 21275 ] 폰 호석만 본문

알고리즘,SQL/백준,BOJ

[ boj : 21275 ] 폰 호석만

폭발토끼 2021. 7. 17. 18:25

https://www.acmicpc.net/problem/21275

 

21275번: 폰 호석만

만약 문제의 조건에 맞는 X, A, B가 유일하게 존재한다면, X를 십진법으로 표현한 수와 A와 B를 공백으로 나누어 출력하라. 만약 만족하는 경우가 2가지 이상이라면 "Multiple"을, 없다면 "Impossible"을

www.acmicpc.net

문제 : 각 해당하는 진법으로 바꾸었을 때 동일한 값을 찾아라

해설 : 아우 ㅡㅡ....난 이래서 문제... 주어진 문자열에서 최대값을 10진법으로 전환했을 때 k 라면 최소 k+1 진법부터 시작해야됩니다...(전 k진법으로 생각해서 자꾸 틀 ㅠ)

위에만 생각하고 있으면 전부 하나씩 전환해보면 됩니다.

#include<bits/stdc++.h>

using namespace std;
using ull = unsigned long long;

const ull limit = (ull)1 << 63;

void convert(string x, string y);
ull f(string s, ull x);

struct info {
	ull a;
	int b, c;
};
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	string a, b;
	cin >> a >> b;
	convert(a, b);
	return 0;
}
void convert(string x, string y)
{
	int mx = -1, my = -1;
	ull ret = 0;
	reverse(x.begin(), x.end());
	reverse(y.begin(), y.end());
	for (int i = 0; i < x.length(); i++)
	{
		if ('0' <= x[i] && x[i] <= '9')
			mx = max(mx, x[i] - '0');
		else
			mx = max(mx, x[i] - 'a' + 10);
	}
	for (int i = 0; i < y.length(); i++)
	{
		if ('0' <= y[i] && y[i] <= '9')
			my = max(my, y[i] - '0');
		else
			my = max(my, y[i] - 'a' + 10);
	}
	vector<info> v;
	for (int i = mx+1; i <= 36; i++)
	{
		for (int j = my+1; j <= 36; j++)
		{
			if (i == j)continue;

			ull tx = f(x, i);
			ull ty = f(y, j);

			//if (tx == ty)cout << tx << " " << ty;
			if (tx < limit && ty < limit && tx == ty)
				v.push_back({ tx,i,j });
		}
	}
	if (v.empty())cout << "Impossible";
	else if (v.size() >= 2) cout << "Multiple";
	else cout << v[0].a << " " << v[0].b << " " << v[0].c;

}
ull f(string s, ull x)
{
	ull ret = 0;
	for (int i = 0; i < s.length(); i++)
	{
		ull plus = 0;
		if ('0' <= s[i] && s[i] <= '9')
			plus = (ull)(s[i] - '0');
		else
			plus = (ull)(s[i] - 'a' + 10);
		ret += (plus * (ull)pow(x, i));
	}
	return ret;
}