[GYM 101755]Restoring Numbers

题面描述

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

输入格式

一共一行,包含两个正整数。

输出格式

一共一行,若有解输出,否则输出。

样例数据

样例输入

6 2

样例输出

4 2

题解

很容易想到暴力的做法

#include
#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=c⋅g,b=d⋅g,(c,d)=1,s=a+b=(c+d)⋅g

故若满足

则满足

显然符合条件,否则无解

#include
#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)