zoukankan      html  css  js  c++  java
  • 埃及分数

    #include<cstdio>
    #include<iostream>
    using namespace std;
    long long final[1005],tmp[1005];
    long long gcd(long long x,long long y)
    {
    	if(y==0)return x;
    	return gcd(y,x%y);
    }
    long long a,b;
    void print(long long d)
    {
    	if(final[d]>tmp[d])//限制分母,不能太大 
    	{
    		for(long long i=1;i<=d;i++)
    		{
    			final[i]=tmp[i];
    		}
    	}
    }
    void dfs(long long a,long long b,long long cnt,long long d)
    {
    	if(cnt==d)//达到指定位数 
    	{
    		tmp[cnt]=b;//记录分母 
    		if(a==1&&tmp[cnt]>tmp[cnt-1])//由于最后一次剩的分母可能小 ,那么就会超出 
    		{
    			print(d);
    		}
    		return ;
    	}
    	for(long long i=max(tmp[cnt-1]+1,b/a+1);i<(d-cnt+1)*b/a;i++) 
    	//首先肯定是从b/a+1开始,然后就是肯定要从上一次计算的下一位做分母,否则肯定大了
    	//循环到剩余位数*b/a 
    	{
    		long long x=b*i/gcd(b,i);//找上一次的结果分母和这次的i分母的最小公倍数 
    		long long y=x*a/b-x/i;
    		//原来的分数a/b×这个公倍数,分母b就去掉了,而x/i也就是新+的分数需要同时扩大的倍数 
    		long long qwq=gcd(x,y);
    		x=x/qwq;
    		y=y/qwq;//约分 
    		tmp[cnt]=i;
    		dfs(y,x,cnt+1,d);
    	} 
    }
    int main()
    {
    	scanf("%lld%lld",&a,&b);
    	long long ss=gcd(a,b);
    	a=a/ss;
    	b=b/ss;
    	//约分 
    	long long d;
    	for(d=2;;d++)//枚举分数个数 
    	{
    		final[1]=0;//长久记录分母的数组 
    		tmp[0]=0;//短暂记录 
    		final[d]=200000001;
    		dfs(a,b,1,d);
    		if(final[1]!=0)break; //找到一个就跑 
    	}
    	for(long long i=1;i<=d;i++)
    	{
    		printf("%d ",final[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    poj 3258
    CodeForces 367E Sereja and Intervals
    Codeforces Round #240 (Div. 2) C Mashmokh and Numbers
    Codeforces Round #240 (Div. 2) D
    zoj 3768 Continuous Login
    2014/4/4做题感悟
    HDU 1878 欧拉回路
    HDU 3018 Ant Trip
    POJ 3694 Network
    Codeforces Round #239 (Div. 2)
  • 原文地址:https://www.cnblogs.com/ShineEternal/p/10896319.html
Copyright © 2011-2022 走看看