F Fraction Construction Problem

题意:

给两个数a,b求另外四个数c,d,e,f满足

  1. c d − e f = a b \frac{c}{d} - \frac{e}{f} = \frac{a}{b} dcfe=ba
  2. d < b and f < b
  3. 1 ≤ c , e ≤ 4 × 1 0 12 1≤c,e≤4×10^{12} 1c,e4×1012
    如果不存在就输出-1 -1 -1 -1
思路:

看了题解之后来写一下思路,当时做一个笔记。

这题的关键点在于第二个条件,如果没有第二个条件,这就是一道非常简单的水题因为直接构造 a + k b − k b \frac{a + k}{b} - \frac{k}{b} ba+kbk(这不是乱杀么 )。

但是有了条件二就无法这样构造,条件二似乎在提示我们, d ∗ f d * f df一定要是 b b b的整数倍,而且 d d d f f f每个都一定要含有 b b b的非1因子,否则无法满足条件二。

那么很自然就会想到质数,当 b b b为质数时上述条件似乎就无法满足了,但是如果分子是质数倍数的话不就又可以直接构造了么?

  1. 此时就可以自然地想到,假设分子分母不互质,那么毕竟约分后分母小于原分母,那么约分后的分数就可以随便构造了
    比如:
    约分后是 u n \frac{u}{n} nu那么就可以构造 u + 1 n − 1 n \frac{u + 1}{n} - \frac{1}{n} nu+1n1(真就乱杀呗 )
  2. 那么当分子和分母互质时呢,此时把式子进行通分得 c f − e d d f = a b \frac{cf -ed}{df} = \frac{a}{b} dfcfed=ba,根据上面的条件 d d d f f f每个都一定要含有 b b b的非1因子,若 d d d f f f不互质,那么 c f − e d d f = a b \frac{cf -ed}{df} = \frac{a}{b} dfcfed=ba就会约分,那么 d f df df一定到达不了 b b b,所以对于存在的质因子数等于1的b一定无解
  3. d d d f f f互质时 d ∗ f = b d*f = b df=b所以只需要求出 c c c e e e满足 c f − e d = a cf-ed=a cfed=a这明显就是exgcd的内容了
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define pb push_back
#define eps 1e-8
#define endl '\n'
using namespace std;
const ll maxn = 2e6 + 5;

ll t,a,b,c,d,e,f,cb[maxn];
bool vis[maxn];

ll exgcd(ll a,ll b, ll &x,ll &y){
    if(!b){
        x = 1,y = 0;
        return a;
    }else{
        ll d = exgcd(b,a % b,y,x);
        y -= a / b * x;
        return d;
    }
}

void Sz(){
    for(int i = 2; i <= maxn; i++){
        if(!vis[i]){
            vis[i] = 1;
            for(int j = i + i; j <= maxn; j += i){
                vis[j] = 1;
                if(!cb[j]){
                    ll k = i;
                    while(!(j % (k * i))) k *= i;
                    if(k < j)cb[j] = k;
                }
            }
        }
    }
}

void solve(){
    ll x,y,d = __gcd(a,b);
    if(d != 1)
        printf("%lld %lld %lld %lld\n",a / d + 1,b / d,1ll,b / d);
    else{
        if(!cb[b])printf("-1 -1 -1 -1\n");
        else{
            d = cb[b],f = b / d;
            exgcd(d,f,x,y);
            if(x > 0)
                printf("%lld %lld %lld %lld\n",x * a,f,-y * a,d);
            else
                printf("%lld %lld %lld %lld\n",y * a,d,-x * a,f);
        }
    }
}

int main(){
    Sz();
    scanf("%lld",&t);
    while(t--){
        scanf("%lld %lld",&a,&b);
        solve();
    }
    return 0;
}


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值