玄关求条Subtask #1TLE
  • 板块P1763 埃及分数
  • 楼主DJCY
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/22 10:30
  • 上次更新2024/12/22 14:28:31
查看原帖
玄关求条Subtask #1TLE
1418709
DJCY楼主2024/12/22 10:30

#include<bits/stdc++.h> #define int long long using namespace std; int a,b; int deep; int ans[102];//预测深度不超过100 int ansz[102];//最优解 int f(int a,int b) { for(int i=1;; ++i) { if(a*i>b) return i; } } bool dfs(int d,int a,int b) { if(d==deep)//达到目标深度 { //判断这个解是否有效 if(b%a!=0)//无效 return false; ans[d]=b/a;//把最后个分母存进去 //找到最优解 if(ans[d]<ansz[d]||ansz[d]==0) for(int i=0; i<=deep; ++i) ansz[i]=ans[i];//把所有的都替换为最优解 return true; }

//没到目标深度
//找到第一个使得1/i小于a/b的i
int i=f(a,b);
if(d>0)
	i=max(i,ans[d-1]+1);//确保每个单位分数都互不相同的
int ok=0;//标记有无找到解
for(;; ++i)
{
	//1/i是当前最大的,那么根据层的目标,如果
	//a/b>(deep-d+1)*1/i 都不满足条件,则剪枝
	if((deep-d+1)*b<=i*a) break;
	ans[d]=i;//
	//a/b-1/i=aa/bb a*i=aa b*i=bb>=aa=a*/-b
	int aa=a*i-b;//计算剩余的分子
	int bb=b*i;//剩余的分母
	int g=__gcd(aa,bb);
	if(dfs(d+1,aa/g,bb/g))
		ok=1;
}
return ok==1;

} signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>a>>b; while(1) { deep++; if(dfs(0,a,b))//找到答案了 { for(int i=0; i<=deep; ++i) cout<<ansz[i]<<' '; return 0; } } return 0; }

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b;
int deep;
int ans[102];//预测深度不超过100
int ansz[102];//最优解
int f(int a,int b)
{
	for(int i=1;; ++i)
	{
		if(a*i>b) return i;
	}
}
bool dfs(int d,int a,int b)
{
	if(d==deep)//达到目标深度
	{
		//判断这个解是否有效
		if(b%a!=0)//无效
			return false;
		ans[d]=b/a;//把最后个分母存进去
		//找到最优解
		if(ans[d]<ansz[d]||ansz[d]==0)
			for(int i=0; i<=deep; ++i)
				ansz[i]=ans[i];//把所有的都替换为最优解
		return true;
	}

	//没到目标深度
	//找到第一个使得1/i小于a/b的i
	int i=f(a,b);
	if(d>0)
		i=max(i,ans[d-1]+1);//确保每个单位分数都互不相同的
	int ok=0;//标记有无找到解
	for(;; ++i)
	{
		//1/i是当前最大的,那么根据层的目标,如果
		//a/b>(deep-d+1)*1/i 都不满足条件,则剪枝
		if((deep-d+1)*b<=i*a) break;
		ans[d]=i;//
		//a/b-1/i=aa/bb a*i=aa b*i=bb>=aa=a*/-b
		int aa=a*i-b;//计算剩余的分子
		int bb=b*i;//剩余的分母
		int g=__gcd(aa,bb);
		if(dfs(d+1,aa/g,bb/g))
			ok=1;
	}
	return ok==1;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>a>>b;
	while(1)
	{
		deep++;
		if(dfs(0,a,b))//找到答案了
		{
			for(int i=0; i<=deep; ++i)
				cout<<ansz[i]<<' ';
			return 0;
		}
	}
	return 0;
}
2024/12/22 10:30
加载中...