2020牛客多校(第三场)- F.Fraction Construction Problem

大致题意:

给你两个正整数 a a a b   ( a , b ≤ 2 × 1 0 6 ) b~(a,b \leq 2 \times 10^6) b (a,b2×106) ,要求出 四个正整数 c , d , e , f c,d,e,f c,d,e,f 满足

  • c d − e f = a b \frac{c}{d}-\frac{e}{f}=\frac{a}{b} dcfe=ba
  • d < b   a n d   f < b dd<b and f<b
  • 1 ≤ c , e ≤ 4 × 1 0 12 1\leq c,e \leq 4 \times 10^{12} 1c,e4×1012

无解则输出 “-1 -1 -1 -1”

分析:

首先 b ! = 1 b!=1 b!=1 显然,因为 d < b   a n d   f < b dd<b and f<b 无法满足,然后考虑 a , b a,b a,b

①: g c d ( a , b ) > 1 gcd(a,b)>1 gcd(a,b)>1
可以构造出 a / g c d ( a , b ) + 1 b / g c d ( a , b ) − 1 b / g c d ( a , b ) = a / g c d ( a , b ) b / g c d ( a , b ) = a b \frac{a/gcd(a,b)+1}{b/gcd(a,b)}-\frac{1}{b/gcd(a,b)}=\frac{a/gcd(a,b)}{b/gcd(a,b)}=\frac{a}{b} b/gcd(a,b)a/gcd(a,b)+1b/gcd(a,b)1=b/gcd(a,b)a/gcd(a,b)=ba

②: g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1
因为 c d − e f = c f − e d d f = a b \frac{c}{d}-\frac{e}{f}=\frac{cf-ed}{df}=\frac{a}{b} dcfe=dfcfed=ba
所以有 c f − e d = k a , d f = k b   ( k > = 1 ) cf-ed=ka,df=kb~(k>=1) cfed=ka,df=kb (k>=1)
此时

  1. b b b 不能为质数,否则 d d d f f f 其中一个必须包含 b b b 才能满足 d f = k b df=kb df=kb ,但此时又无法满足 d < b   a n d   f < b dd<b and f<b ,矛盾;
  2. b b b 不能为质数幂次,否则假设 b = p t , d = k 1 p a , f = k 2 p b , k = k 1 k 2 , t = a + b b=p^t,d=k_1p^a,f=k_2p^b,k=k_1k_2,t=a+b b=pt,d=k1pa,f=k2pb,k=k1k2,t=a+b ,那么 l c m ( d , f ) lcm(d,f) lcm(d,f) p p p 的幂次小于 b b b p p p 的幂次是显然的,而 a b \frac{a}{b} ba 又是最简化形式,矛盾;
  3. b b b 的质因数 > 1 >1 >1 ,假设 b = p 1 e 1 p 2 e 2 p 3 e 3 ⋯ b=p_1^{e_1}p_2^{e_2}p_3^{e_3}\cdots b=p1e1p2e2p3e3 ,令 d = p 1 e 1 , f = b / d d=p_1^{e_1},f=b/d d=p1e1,f=b/d ,那么 g c d ( d , f ) = 1 gcd(d,f)=1 gcd(d,f)=1 ,所以 c f − e d = k a cf-ed=ka cfed=ka 一定有解,用扩展欧几里得
    计算即可

代码:

#include
using namespace std;
#define ll long long
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define frep(i,a,b) for(int i=a;i>=b;i--)
const int N = 2E6+10;
int cnt,pr[N];
bool is_p[N];

void prime(int n)
{
	memset(is_p,true,sizeof is_p);
	is_p[1]=0;
    rep(i,2,n){
    	if(is_p[i]) pr[++cnt]=i;
    	for(int j=1;j<=cnt&&i*pr[j]<=n;j++){
    		is_p[i*pr[j]]=0;
    		if(i%pr[j]==0)break;
		}
	}
}

void exgcd(ll a,ll b,ll &x,ll &y)
{
	if(!b){
		y=0,x=1;
		return;
	}
	exgcd(b,a%b,y,x);
	y-=a/b*x;
}

int main()
{
	//freopen("1.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
    prime(2e6); 
    int t; cin>>t;
    while(t--)
    {
    	ll a,b,c,d,e,f,k,x,y;
    	cin>>a>>b;
    	if(__gcd(a,b)>1){
    		k=__gcd(a,b);
    		cout<<a/k+1<<" "<<b/k<<" "<<1<<" "<<b/k<<endl;
			continue; 
		}
		if(b==1||is_p[b]){
			cout<<"-1 -1 -1 -1"<<endl;
			continue;
		}
		d=1,f=b;
		for(int i=1;i<=cnt&&pr[i]*pr[i]<=f;i++)
		if(f%pr[i]==0)
		{
			while(f%pr[i]==0) d*=pr[i],f/=pr[i];
			break;
		}
		
		if(f==1){
			cout<<"-1 -1 -1 -1"<<endl;
			continue;
		}
		
		exgcd(f,d,x,y);
		c=x*a,e=y*a;
		if(c<0) swap(d,f),swap(c,e);
		cout<<c<<" "<<d<<" "<<-e<<" "<<f<<endl;
		
	}
} 

你可能感兴趣的:(NKDX)