[GYM 101755]Restoring Numbers

题面描述

已知两个正整数a,b的和s与最大公约数g,求a,b

输入格式

一共一行,包含两个正整数\(s,g\)

输出格式

一共一行,若有解输出\(a,b\),否则输出\(-1\)

样例数据
样例输入

6 2

样例输出

4 2

题解

很容易想到暴力的做法

#include<bits/stdc++.h>
#define mod 1000000007
#define maxn 1000005
#define local
using namespace std;
inline char get(){
    static char buf[30000],*p1=buf,*p2=buf;
    return p1==p2 && (p2=(p1=buf)+fread(buf,1,30000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    register char c=get();register int f=1,_=0;
    while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get();
    while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get();
    return _*f;
}
int s,g,a=1,b=0x3f3f3f3f;
signed main(){
    //freopen("1.txt","r",stdin);
    s=read(),g=read();
    int flag=1;
    while(b%g!=0){
        a=g*flag,b=s-a;
        flag++;
        if(a>=s){
            cout<<-1;
            return 0;
        } 
    }
    cout<<a<<" "<<b<<endl;
}

不过拜倒在了\(10^9\)的数据范围之下。
理智分析,我们可以发现:\[ a=c⋅g,b=d⋅g,(c,d)=1,s=a+b=(c+d)⋅g \]

故若满足\[g|sg|s , s>gs>g\]

则满足\[a=g,b=s−g\]

显然符合条件,否则无解

#include<bits/stdc++.h>
#define mod 1000000007
#define maxn 1000005
#define local
using namespace std;
inline char get(){
    static char buf[30000],*p1=buf,*p2=buf;
    return p1==p2 && (p2=(p1=buf)+fread(buf,1,30000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    register char c=get();register int f=1,_=0;
    while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get();
    while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get();
    return _*f;
}
int main(){
    freopen("1.txt","r",stdin);
    int s,g;
    s=read(),g=read();
    if(s%g!=0||s==g)printf("-1\n");
    else printf("%d %d\n",g,s-g); 
    return 0;
}

转载于:https://www.cnblogs.com/Chen574118090/p/11612993.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值