rt,每次输出都不同,但是每次输出都比较接近 1000,差在 30 以内,好像也没有变量没初始化的吧
#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int base=1e8;
struct Int
{
vector<ll> a;
int len() { return a.size(); }
void init(string s)
{
for (int r=s.size()-1,l,num;r>=0;r-=8) {
l=r>6?r-7:0,num=0; for (int i=l;i<=r;i++)
num=num*10+(s[i]&15); a.push_back(num);
}
}
void print() {
reverse(a.begin(),a.end() ); printf("%llu",a[0]);
for (int i=1;i<a.size();i++) printf("%08llu",a[i]);
}
friend Int operator +(Int a,Int b)
{
if (a.len()<b.len() )
swap(a,b); Int c; ll t=0;
for (int i=0;i<a.len();i++) {
t+=a.a[i]; if (i<b.len() ) t+=b.a[i];
c.a.push_back(t%base),t/=base;
}
if (t) c.a.push_back(t);
return c;
}
friend Int operator -(Int a,Int b)
{
Int c; ll t=0;
for (int i=0;i<a.len();i++) {
t+=a.a[i]; if (i<b.len() ) t-=b.a[i];
t<0?(c.a.push_back(t+base),t=-1):(c.a.push_back(t),t=0);
}
while (c.len()>1&&!c.a.back() ) c.a.pop_back();
return c;
}
friend Int operator *(Int a,Int b)
{
Int c;
c.a.resize(a.len()+b.len() );
for (int i=0;i<a.len();i++)
for (int j=0;j<b.len();j++)
c.a[i+j]+=a.a[i]*b.a[j];
for (int i=0;i<c.len();i++)
if (c.a[i]>base) c.a[i+1]+=c.a[i]/base,c.a[i]%=base;
while (c.len()>1&&!c.a.back() ) c.a.pop_back();
return c;
}
friend Int operator /(Int a,int b)
{
Int c; ll t=0; for (int i=a.len()-1;~i;i--)
t=t*base+a.a[i],c.a.push_back(t/b),t%=b;
reverse(c.a.begin(),c.a.end() );
while (c.len()>1&&!c.a.back() ) c.a.pop_back();
return c;
}
bool operator <=(Int o)
{
if (a.size()<o.len() ) return true;
if (a.size()>o.len() ) return false;
for (int i=a.size()-1;~i;i++) {
if (a[i]<o.a[i]) return true;
if (a[i]>o.a[i]) return false;
}
return true;
}
friend Int operator ^(Int a,int b)
{
Int ans;
ans.init("1");
while (b) {
if (b&1) ans=ans*a;
a=a*a,b>>=1;
}
return ans;
}
};
main()
{
int k; string s; cin>>k>>s;
Int a,l,r,one; a.init(s),one.init("1"),l=one,r=a;
while (l<=r) {
Int mid=(l+r)/2;
if (mid.len()*k-k<a.len()&&(mid^k)<=a) l=mid+one;
else r=mid-one;
}
r.print();
return 0;
}