この質問はあまりにも犬である、と私はそれが暴力、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;
}