Description
将一个数
y
转化成
一行两个数 y(10<=y<=1018) 和 l(10<=l<=y) 。
Output
输出最大的合法的 b 。
看似简短的题面,实际上……我看不懂=w=
(可能给我原题面还好一点……)
大概意思就是,把
y
转成
那么以下为正式题目分析:
注意到一点,就是
这也就意味着,
b
在
这种情况就可以枚举
(y)b
,二分
b
另一种情况就是当
(题外话:这题
(没发现二分的时候
mid2
炸了……感觉身体被掏空=w=)
#include<stdio.h>
#define check1(k) (i%10+i%100/10*k+i/100*k*k)
typedef long long ll;
ll n,m,ans;
inline bool check(const ll &k)
{
ll rt=0,t=1;
for (ll x=n;x;rt+=x%k*t,x/=k,t*=10) if (9<x%k) return 0;
return m<=rt;
}
int main()
{
scanf("%lld%lld",&n,&m);
for (ll i=m;i<1000;i++)
{
ll l=1,r=1e9;
if (i<100) r=1e18;
for (ll mid=(l+r)>>1;l<r;mid=(l+r)>>1) if (check1(mid)<n) l=mid+1;
else r=mid;
if (check1(l)==n)
{
ans=l;
break;
}
}
for (ll i=1000000;ans<i;i--) if (check(i))
{
printf("%lld",i);
return 0;
}
printf("%lld",ans);
}