埃及分数样例和P1763能过,但是WA求调
查看原帖
埃及分数样例和P1763能过,但是WA求调
965685
yyrwlj楼主2024/1/12 10:34
#include <iostream>
using namespace std;
typedef long long LL;
int dep;
bool flag;
LL s[30], ans[30];
int q[10], k;
LL gcd(LL x,LL y)
{
    return y ? gcd(y, x % y) : x;
}
bool in(int x)
{
    for (int i=0;i<k;i++)
        if (x == q[i])
	    return true;
    return false;
}
bool check()
{
    for (int i=dep;i;i--)
	 if (s[i] != ans[i])  
              return s[i] < ans[i];
    return false;
}
void dfs(LL a,LL b,int num)
{
    if (num > dep)
        return;
    if (a == 1 && b > s[num - 1])
    {
        s[num] = b;
        if (!flag || check())
        {
            for (int i=1;i<=dep;i++)
                ans[i] = s[i];
            flag = true;
        }
        return;
    }
    LL l = max(b / a, s[num - 1] + 1), r = (dep - num + 1) * b / a;
    if (flag && r >= ans[dep])
        r = ans[dep] - 1;
    for (LL i=l;i<r;i++)
    {
    	if (in(i))
    		continue;
        s[num] = i;
        LL y = gcd(a * i - b, b * i);
        dfs((a * i - b) / y, b * i / y, num + 1);
    }
}
int main()
{
	int T;
	scanf("%d", &T);
	for (int t=1;t<=T;t++)
	{
	    s[0] = 1;
	    LL a, b;
	    scanf("%lld%lld%d", &a, &b, &k);
	    for (int i=0;i<k;i++)
	    	scanf("%d", &q[i]);
	    printf("Case %d: %lld/%lld=", t, a, b);
	    dep = 0;
	    flag = false;
	    while (++dep)
	    {
	        dfs(a, b, 1);
	        if (flag)
	        {
	            for (int i=1;i<dep;i++)
	                printf("1/%lld+", ans[i]);
	            printf("1/%lld\n", ans[dep]);
	            break;
	        }
	    }
	}
    return 0;
}
2024/1/12 10:34
加载中...