本地代码样例每次输出都不同是咋回事?
查看原帖
本地代码样例每次输出都不同是咋回事?
681036
OldDriverTree楼主2023/10/8 21:03

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;
}
2023/10/8 21:03
加载中...