玄关,关于IDA*的一道题
  • 板块学术版
  • 楼主a_blue_fool
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/23 21:42
  • 上次更新2024/7/23 23:35:43
查看原帖
玄关,关于IDA*的一道题
1046223
a_blue_fool楼主2024/7/23 21:42

原题

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>

#define ll long long

using namespace std;

ll t , a , b , k , d , q;
ll ans[1000000] , ou[1000000] , tmpa[1000000] , tmpb[1000000];
bool mark[1005];

ll gcd (ll a , ll b){
	if (a%b == 0) return b;
	return gcd(b,a%b);
}

bool cmp (ll a1 , ll b1 , ll a2 , ll b2){
	a1 *= b2;
	a2 *= b1;
	
	return a1 > a2;
}

bool fcmp (ll a , ll b){
	return a > b;
}

bool IDA (ll a , ll b , ll dd){
	if (dd == d){
		if (b%a == 0){
			ans[dd] = b/a;
			
			for (ll i = dd ; i >= 1 ; i--){
				if (ou[i] > ans[i]){
					for (ll j = 1 ; j <= dd ; j++)
						ou[j] = ans[j];
					break;
				}
				else if (ou[i] < ans[i]){
					break;
				}
			}
			return true;
		} 
		return false;
	}
	
	bool flag = false;
	for (ll i = ans[dd-1]+1 ; cmp((d-dd+1),i,a,b) ; i++){
		ll aa = a*i-b , bb = b*i;
		ll GCD = gcd(aa,bb);
		aa /= GCD , bb /= GCD;
		ans[dd] = i;
		
		if (mark[i]) continue;
		if ((aa < 0) ^ (bb < 0)) continue;
		
		if (IDA(aa,bb,dd+1)){
			flag = true;
		}
	}
	
	return flag;
}

int main(){
	scanf("%lld" , &t);
	ans[0] = 1;
	
	for (ll i = 1 ; i <= t ; i++){
		scanf("%lld%lld%lld" , &a , &b , &k);
		memset (mark , 0 , sizeof (mark));
		memset (ou , 0x3f , sizeof (ou));
		for (ll j = 1 ; j <= k ; j++) scanf("%lld" , &q) , mark[q] = true;
		
		for (d = 1 ; ; d++)
			if (IDA(a,b,1))
				break;
		
		printf("Case %lld: %lld/%lld=" , i , a , b);
		for (ll i = 1 ; i < d ; i++)
			printf("1/%lld+" , ou[i]);
		printf("1/%lld\n" , ou[d]);
	}
	
	return 0;
}
2024/7/23 21:42
加载中...