当时代码:
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define lowbit(x) ((x)&(-(x)))
#define int long long
#define rep(i,a,b) for(int i=(int)a,i##i=(int)b;i<=i##i;i++)
#define per(i,a,b) for(int i=(int)a,i##i=(int)b;i>=i##i;i--)
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 1000005;
const double PI = acos(-1);
string s;
char c;
int n;
void solve()
{
int a,b;
cin>>a>>b;
//cout<<a%b<<' '<<b%a;
#if 0
if(b-a==1||a-b==1){cout<<-1;return;}
//else if(__gcd(a,b)!=1)cout<<0;
//else cout<<__gcd(a,b);
int c=0;
for(;;c++){
if(__gcd(a+c,b+c)!=1){cout<<c;return ;}
//if((a+c)%(b+c)==1||(b+c)%(a+c)==1){cout<<-1;return;}
//if((b+c)%(a+c)==0||(a+c)%(b+c)==0){cout<<-1;return ;}
if(c==max(a,b))break;
}
cout<<-1;
#endif
// if(a==1&&b==1){cout<<-1;return;}
if(abs(a-b)==1){cout<<-1;return;}
int c=0;
for(;;c++){
if(__gcd(b+c,abs(a-b))!=1){cout<<c;return ;}
if(__gcd(a+c,abs(b-a))!=1){cout<<c;return ;}
}
}
signed main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _ = 1;
//cin>>_;
while(_--)
solve();
}
运行超时
通过率92.45%
代码2:
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define lowbit(x) ((x)&(-(x)))
#define int long long
#define rep(i,a,b) for(int i=(int)a,i##i=(int)b;i<=i##i;i++)
#define per(i,a,b) for(int i=(int)a,i##i=(int)b;i>=i##i;i--)
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 1000005;
const double PI = acos(-1);
string s;
char c;
int n;
void solve()
{
int a,b;
cin>>a>>b;
//cout<<a%b<<' '<<b%a;
if(b-a==1||a-b==1){cout<<-1;return;}
//else if(__gcd(a,b)!=1)cout<<0;
//else cout<<__gcd(a,b);
int c=0;
for(;;c++){
if(__gcd(a+c,b+c)!=1){cout<<c;return ;}
//if((a+c)%(b+c)==1||(b+c)%(a+c)==1){cout<<-1;return;}
//if((b+c)%(a+c)==0||(a+c)%(b+c)==0){cout<<-1;return ;}
if(c==max(a,b))break;
}
cout<<-1;
}
signed main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _ = 1;
//cin>>_;
while(_--)
solve();
}
运行超时
通过率94.34%
小落咩 的AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int a,b;
cin>>a>>b;
if(a<b)swap(a,b);
if(a==1&&b==1)cout<<"1";
else if(__gcd(a,b)!=1)cout<<"0";
else if(abs(a-b)==1)cout<<"-1";
else
{
if(a<b)swap(a,b);
int d=a-b,ans=1e18;
for(int i=2;i*i<=d;i++)
if(d%i==0)
{
//cout<<i<<endl;
ans=min(ans,i-a%i);
ans=min(ans,d/i-a%(d/i));
//return 0;
}
ans=min(ans,d-a%d);
cout<<ans;
}
cout<<"\n";
return 0;
}
因为 gcd(a,b)=gcd(b,a-b)
所以 gcd(a+c,b+c)=gcd(b+c,a-b)
所以可以求(a-b)所有的因子,求最小c使得b+c==(a-b)的因子!=1
gcd(b+c,a-b)!=1
所以可以打出
if(a<b)swap(a,b);
int d=a-b;
for(int i=2;i*i<=d;i++)
if(d%i==0)
{
cout<<i<<' ';
}
讨论题解:
所以
ans=min(ans,i-a%i);//实际上是c=p-(a mod p) , 取最小值
ans=min(ans,d/i-a%(d/i));//同样也是,因为暴力枚举时间复杂度不对,所以得要压缩,增加系数减少渐进时间
最后记上本身算一个因子:
ans=min(ans,d-a%d);
本题重点:
1.gcd恒等式 : gcd(a,b)=gcd(b,a-b)
2.gcd本身性质:求两者公共因子的最大值