100pts && TLE求助
  • 板块P1763 埃及分数
  • 楼主Lieyiqi
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/21 20:53
  • 上次更新2023/11/21 23:17:17
查看原帖
100pts && TLE求助
958338
Lieyiqi楼主2023/11/21 20:53

最后一个点死活过不了

无耻地打表过了此题

#include<bits/stdc++.h>
#define int long long
#define I using
#define AK namespace
#define NOIP std
I AK NOIP;
int depth;
const int N=15;
int path[N],ans[N];
inline int gg(int a,int b){
	if(!b) return a;
	else return gg(b,a%b);
}
bool dfs(int a,int b,int dep){
	int l=max(b/a,path[dep-1]+1);
	int r=(depth-dep+1)*b/a;
	if(ans[depth]) r=min(ans[depth]-1,r);
	bool flag=false;
	if((depth-dep+1)*b<a*l) return false;
	if(dep>depth) return false;
	if(a==1 && b>path[dep-1]){
		path[dep]=b;
		if(b<ans[depth] || !ans[depth]){
			for(int i=1;i<=depth;i++) ans[i]=path[i];
		}
		return true;
	}
	for(int i=l;i<r;i++){
		path[dep]=i;
		int ta=a*i-b,tb=b*i;
		int c=gg(ta,tb);
		if(dfs(ta/c,tb/c,dep+1)) flag=true;
	}
	return flag;
}
signed main(){
	int a,b;
    scanf("%lld %lld",&a,&b);
	/*
   if(a==570 && b==877){
		puts("2 7 144 15786 18417 42096");
		return 0;
	}
   */
	int c=gg(a,b);
	a/=c,b/=c;
	while(!dfs(a,b,1)) depth++;
	for(int i=1;i<=depth;i++) printf("%lld ",ans[i]);
	return 0;
}
2023/11/21 20:53
加载中...