2020牛客暑期多校训练营(第三场) F Fraction Construction Problem

Fraction Construction Problem

https://ac.nowcoder.com/acm/contest/5668/F

题目大意

t(1t105)次查询,每个查询给出两个正整数a,b(a,b≤2×106)。
输出一组满足以下条件的四个正整数c,d,e,f
如果没有解决方案,输出“ -1 -1 -1 -1”。

解题思路

进行赛后冷静分析,可以归纳出三种情况,这三种情况只需在代码中依次判断:

情况一:b=1或者b是质数时,一定无解。这种情况很好理解。
情况二:gcd(a,b)!=1时,求出g=gcd(a,b),一定存在一组解:c=a/g+1,d=b/g,e=1,f=b/g

情况三:当gcd(a,b)=1,即ab互质时,因为这里b不是质数,可以分成两个相异质因数--d,f,所以要以b=df且d,f互质的条件找到d,f。
寻找2到sqrt(b)的素数,找出第一个被b整除的素数i,然后将f赋值为b/i。
接下来要开始求出c,e。已知b=df,所以根据原方程可得a=c×f−e×d,求解c和e,就能用扩展欧几里得算法来求解c,e。
在求出c和e之后要判断一下正负,通过c和e的正负性判断两个相异质因数分别对应谁。

AC代码

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
	if(b==0) return a;
	return gcd(b,a%b);
}
long long exgcd(long long a,long long b,long long &x,long long &y)
{
	if(b==0)
	{
		x=1,y=0;
		return a;
	}
	long long s=exgcd(b,a%b,x,y),t=x;
	x=y,y=t-(a/b)*y;
	return s;
}
int main()
{
	int a,b,g,i,j;
	long long c,d,e,f,t,x;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&a,&b);
		g=gcd(a,b);
        if(g>1)
		{
            printf("%d %d %d %d\n",a/g+1,b/g,1,b/g);
            continue;
        }
        d=f=0;
        for(i=2;i*i<=b;i++)
            if(b%i==0 && gcd(i,b/i)==1)
			{
                d=i,f=b/i;
                break;
            }
        if(d==0 && f==0)
		{
            printf("-1 -1 -1 -1\n");
            continue;
        }
        c=e=0;
        x=exgcd(f,d,c,e);
        c*=a,e*=a;
        if(c>0 && e<0) printf("%lld %lld %lld %lld\n",c,d,-e,f);
        else printf("%lld %lld %lld %lld\n",e,f,-c,d);
	}
}


2020牛客暑期多校训练营 文章被收录于专栏

只是题解,可参考,可学习,可点赞:)

全部评论

相关推荐

01-17 18:15
已编辑
门头沟学院 前端工程师
从上午约我面试然后他迟到,然后中午发消息打电话给我说重约面试时间,我就该意识到。【管理不规范,只是这家公司最小的问题】他妈一个不是技术的人来给我技术面。。。连vvue什么?连react是什么?连普通的HTTP请求是什么?这些东西都不懂的人来给我做技术面,我真的。。。。他妈浪费我40分钟。。一天面了三场,这家公司属实牛逼。不停的问我说上班下班时间谁来派任务公司在哪个区发展怎么样,公司的管理模式什么样,培养机制怎么样带教负责什么。如果出bug了谁来负责。我真的求你了别闹了。我答了15分钟,我已经很不想回答了。然后他就问了我一些很招笑的面试问题。问我前端框架架构设计怎么设计,Websocket可以实现SSE吗??最后还要我硬说,为什么我们公司没转正?为什么?为什么?我说我怎么知道。。这是领导决定,又不是我决定,他说让我分析一下。。。我真的草了,这个人是来搞我的吗?我最后问我说这个没有技术面,他说他就是技术面虽然我今天面的另外两家也很逆天。一个人不停的吹牛,自己100人的公司是全国前几,吹牛了一个小时。我中途几次想跑,真的是底下玩手机在听他那吹牛。。然后最后来了句说,我承诺的东西要实现哦,不然的话,公司会追责的,我我请问我承诺了什么?从头到尾也没有说让我承诺什么。而且我只是作为一个小小的前端卡拉咪,应届生。我要承担什么??好崩溃。。好崩溃的,一天面了三场。两家1000-9999的公司。面试官问的都很傻逼,甚至有些东西我问他估计都答不出来。。&nbsp;我这是在干嘛呀?浪费我一天的时间,我的奶奶。。我本来是抱着说我很菜,我要面试中发现自己的问题,现在来看他妈的这三场面试,面试本身就是问题。。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务