栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1980 Unit Fraction Partition

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1980 Unit Fraction Partition

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;#define maxn 10struct Partition{    long long a, b;    Partition(long long aa, long long bb) :        a(aa), b(bb)    {    }    Partition()    {    }} par[maxn];long long ans;long long p, q, a, n;bool operator<(const Partition &x, const Partition &y){    return x.a * y.b < y.a * x.b;}long long gcd(long long x, long long y){    if (!x ||!y)        return x > y ? x : y;    for (long long t; t = x % y; x = y, y = t)        ;    return y;}Partition abstract(Partition a, Partition b){    Partition ret;    ret.b = a.b * b.b;    ret.a = a.a * b.b - b.a * a.b;    long long g = gcd(ret.a, ret.b);    ret.a /= g;    ret.b /= g;    return ret;}void dfs(long long t, Partition left, long long sum){    if (left.b / left.a * sum > a)        return;    if (left.a ==1&& left.b >= par[t -1].b && sum * left.b <= a)    {        ans++;    }    if (t >= n)        return;    if ((n - t +1.0) * left.b / left.a < par[t -1].b)        return;    for (long long i = max(par[t -1].b, left.b / left.a); sum * i <= a && (n - t +1.0) * left.b / left.a >= i; i++)    {        par[t].a =1;        par[t].b = i;        if (par[t] < left)        { dfs(t +1, abstract(left, par[t]), sum * i);        }    }}int main(){   while (scanf("%lld%lld%lld%lld", &p, &q, &a, &n), p | q | a | n)    {        ans =0;        par[0].a = par[0].b =1;        long long g = gcd(p, q);        dfs(1, Partition(p / g, q / g), 1);        printf("%lldn", ans);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370205.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号