[NOIP2017提高组]小凯的疑惑-扩展欧几里得

#include<bits/stdc++.h>
using namespace std;
long long a,b,x,y,ans,tmp;
inline void ex_gcd(long long a,long long b,long long &x,long long &y){
	if(!b){
		x = 1;
		y = 0;
		return;
	}
	ex_gcd(b,a%b,y,x);
	y -= (a/b)*x;
}
int main(){
	cin>>a>>b;
	ex_gcd(a,b,x,y);
	if(x > 0)swap(a,b),swap(x,y);
	tmp = (-x)/b;
	x = x+tmp*b;
	y = y-tmp*a;
	while(x < 0)x += b,y -= a;
	while(x > 0)x -= b,y += a;
	tmp = x+b;
	ans = a*(tmp-1)+b*(y-1);
	cout<<ans-1<<endl;
	return 0;
}

  还有特别巨小伙伴直接用

#include<bits/stdc++.h>
using namespace std;
long long a,b,ans,sum,t;
int main(){
    scanf("%lld %lld",&a,&b);
    if (a>b)swap(a,b);
    t=(a-1)*b/a-1;
    sum=(sum+(a-1)*b)%a;
    printf("%lld",t*a+sum);
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/wangyifan124/p/10304559.html