90求调
查看原帖
90求调
549499
Disjoint_cat楼主2022/11/26 17:17

rt,最后一个点挂了

然鹅既不是WA也不是TLE,而是MLE

感觉是死循环了

#include<bits/stdc++.h>
#define ll long long
#define YJL_DRC_LCH_WJY_WQY_ZZH using
#define AK namespace
#define IOI std
#define V vector<int>
#define sz size()
YJL_DRC_LCH_WJY_WQY_ZZH AK IOI;
const int MAX=10000000;
ll gcd(ll x,ll y)
{
	if(x<y)swap(x,y);
	return y?gcd(y,x%y):x;
}
ll lcm(ll x,ll y){return (ll)x*y/gcd(x,y);}
struct frac
{
	ll fz,fm;
	frac(ll Fz=0,ll Fm=0):fz(Fz),fm(Fm){}
	double val(){return (double)fz/fm;}
	frac operator-(const frac B)
	{
		if(fz*B.fm==fm*B.fz)return frac(0,1);
		ll t=lcm(fm,B.fm),u=t/fm,v=t/B.fm;
		frac res;
		res.fz=u*fz-v*B.fz,res.fm=t;
		ll g=gcd(res.fz,res.fm);
		res.fz/=g,res.fm/=g;
		return res;
	}
}N;
V ans,now;
int maxdep;
void chk()
{
	bool ok;
	if(now.sz!=ans.sz||!ans.sz)ok=now.sz<ans.sz||!ans.sz;
	else
	{
		for(int i=now.sz-1;~i;--i)
			if(now[i]!=ans[i])
			{
				ok=now[i]<ans[i];
				break;
			}
	}
	if(ok)ans=now;
}
void print(V an)
{
	for(int i=0;i<maxdep;i++)cout<<an[i]<<" ";
	cout<<endl;
}
void dfs(frac n)
{
	if(!n.fz){chk();/*print(now);*/return;}
	int si=now.sz;
	if(si>=maxdep)return;
	for(int i=max(si?now.back()+1:2,(int)ceil((double)n.fm/n.fz));i<=MAX;i++)
	{
		if(si+(int)ceil((double)n.fz*i/n.fm)>maxdep)break;
		now.push_back(i);
		dfs(n-frac(1,i));
		now.pop_back();
	}
}
int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>N.fz>>N.fm;
	for(maxdep=1;ans.empty();maxdep++)dfs(N);
	print(ans);
	return 0;
}
2022/11/26 17:17
加载中...