美文网首页
[GYM 101755]Restoring Numbers

[GYM 101755]Restoring Numbers

作者: 影踪派熊猫人武僧 | 来源:发表于2019-09-30 15:35 被阅读0次

题面描述

已知两个正整数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;
}

相关文章

网友评论

      本文标题:[GYM 101755]Restoring Numbers

      本文链接:https://www.haomeiwen.com/subject/jnthpctx.html