1010基数PTA

この質問はあまりにも犬である、と私はそれが暴力、24ポイントの結果の無実だと思った...
サブデータ範囲の対象ではありませんので... 2分、または24分間の沈黙の中で学ばなければならなかった、私が通り、36進にそれを考えます死はMAを設定し、
この問題は、最初の数字のために長い長いバーストしません
、我々は長い長いZezhengそのバーストができたときに後半の数に?特別審査員!私たちは10進数秒数の時に(それだけで負の数になりますが、自然数になることはできません)爆撃を受けた場合
の時間、私たちは最初の数3うまくより大きい数に入れてそれは
主に半分と考えている、私は重要な長い長い解決する方法がわからない
良い反射を
コードに

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int r(char c)
{
	if(isalpha(c)) return  c-'a'+10;
	return c - '0';
}
int main()
{
	ll sum = 0,ok = 0;
	int jin,tag,w1[20],w2[20];
	string s1,s2,t;
	cin>>s1>>s2>>tag>>jin;
	if(tag == 2)
	{
		t = s2; s2 = s1; s1 =t;
	}//让s1 为已知进制
	int n1 = s1.size(),n2 = s2.size();
	//字母化数字好看 
	for (int i = 0; i < n1; i++)	w1[i] = r(s1[i]); 
	for (int i = 0; i < n2; i++)    w2[i] = r(s2[i]);
	//判断是否超进制如果超则不行 
	for	(int i = 0; i < n1; i++)  {
		if(w1[i] >= jin){
			sum = -1;break;
		}
		else{
			sum = sum*jin+w1[i];
		}
	}
	if(sum == -1) printf("Impossible\n");
	else{
		//确立一下 l 的 范围,至少要大于数字内的最大数 
		ll l = 0,r = sum+5; //r 等于sum+5 是因为下面二分不会取到r这个点 
		for (int i = 0; i < n2; i++)
		{
			if(l < w2[i]) l = w2[i];
		}
		l++;
		//纯纯的二分 
		while(l < r){
			ll mid = (r+l)/2;
			ll sum2 = 0;
			for (int i = 0; i < n2; i++) 
			{
				sum2 = sum2*mid + w2[i];
				if(sum2 < 0)
				{
					sum2 = sum+3; break;//溢出了 
				} //溢出的数肯定比sum大 
			}
			if(sum2 >= sum) 
			{
				r = mid; if(sum2 == sum) ok = 1;
			} 
			else l = mid+1; 
		}
		if(ok) printf("%lld\n",l);
		else   printf("Impossible\n");
		
	}
	return 0;
}
公開された55元の記事 ウォンの賞賛1 ビュー2639

おすすめ

転載: blog.csdn.net/qq_37548017/article/details/102821065