社区讨论

40pts求调,悬2关

P1763埃及分数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhke08p0
此快照首次捕获于
2025/11/04 17:49
4 个月前
此快照最后确认于
2025/11/04 17:49
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int gcd(int a,int b){
	if(b==0)return a;
	return gcd(b,a%b);
}
struct node{
	int f,s;
	bool operator<(node x)const{
		return f*x.s<s*x.f;
	}
	bool operator>(node x)const{
		return f*x.s>s*x.f;
	}
	node operator-(node x)const{
		int _gcd_=gcd(s,x.s);
		node temp;
		temp.f=f*x.s/_gcd_-s*x.f/_gcd_;
		temp.s=s*x.s/_gcd_;
		return temp;
	}
	node operator/(int x)const{
		node temp;
		temp.f=f;
		temp.s=s*x;
		return temp;
	}
};
int a,b,depth,flag,minn=2e7+5;
int last[1145],ans[1145];
void yue(node &x){
	int _gcd_=gcd(x.f,x.s);
	x.f/=_gcd_;
	x.s/=_gcd_;
	return;
}
node make_(int x,int y){
	node temp;
	temp.f=x,temp.s=y;
	yue(temp);
	return temp;
}
void dfs(int x,node now){
	yue(now);
	if(x==depth){
		if(now.f==1&&now.s<minn&&now.s>last[x-1]){
			for(int i=1;i<=x-1;i++)ans[i]=last[i];
			flag=1;
			ans[x]=now.s;
		}
		return;
	}
	node maxn=now/(depth-x+1);
	yue(maxn);
	int k=last[x-1]+1;;
	while(make_(1,k)>now)k++;
	for(;make_(1,k)>maxn;k++){
		last[x]=k;
		dfs(x+1,now-make_(1,k));
	}
	return;
}
signed main(){
	cin>>a>>b;
	node fir=make_(a,b);
	while(++depth){
		last[0]=1;
		dfs(1,fir);
		if(flag){
			for(int i=1;i<=depth;i++){
				cout<<ans[i]<<" ";
			}
			return 0;
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...