2020牛客暑期多校第三场 F-Fractio Construction Problem(扩展欧几里得)

本文主要是介绍2020牛客暑期多校第三场 F-Fractio Construction Problem(扩展欧几里得),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目戳这里
题意:
在这里插入图片描述
分情况讨论下:
1.设g=gcd(a,b),若g > 1,即不为最简分式,此时直接令d = b/g,c = a+b,e = f = 1,即可因为此时构造是满足d < b并且f < b的
2.g = 1,此时分式为最简分式,但如果 b 不能分解出两个不一样的质因子,此时就无法完成构造,直接输出-1
3.g = 1,但是此时b有两个不同质因数,通分后分子上即可变为cf-de = agcd(f,d),即便未解方程fx-dy = agcd(f,d),可知变为扩展欧几里德问题。
最后别忘了我们求得结果再乘上a才是对应于我们这一问题的解

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int MAXN = 2e6+7;
int prime[MAXN],fac[MAXN],cnt;ll gcd(ll a,ll b){if(a < b) swap(a,b);ll r;while(a%b != 0){r = a % b;a = b;b = r;}return b;
}ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x = 1, y = 0;return a;}ll g = exgcd(b,a%b,y,x);y -= (a/b)*x;return g;
}void euler(){//欧拉筛打出当前的数的质因数是多少int t;fac[1] = 1;for(int i = 2;i < MAXN;i ++){if(!fac[i]){prime[++cnt] = i;fac[i] = i;}for(int j = 1;(t = i*prime[j]) < MAXN;j ++){fac[t] = prime[j];if(i % prime[j] == 0) break;}}
}int main()
{ll a,b,c,d,e,f;int t;euler();scanf("%d",&t);while(t--){scanf("%lld%lld",&a,&b);ll g = gcd(a,b);if(g > 1){a /= g,b /= g;d = b,c = b + a,e = f = 1ll;printf("%lld %lld %lld %lld\n",c,d,e,f);}else{d = 1,f = b;while(fac[b] != 1 && f%fac[b] == 0){//有多个质因子的情况d *= fac[b];f /= fac[b];}if(b == d || f == 1){//不能进行分解的情况puts("-1 -1 -1 -1");}else{exgcd(f,d,c,e);e = -e;while(e <= 0 ||c <= 0){e += f;c += d;}e *= a;c *= a;printf("%lld %lld %lld %lld\n",c,d,e,f);}}}return 0;
}

这篇关于2020牛客暑期多校第三场 F-Fractio Construction Problem(扩展欧几里得)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/315754

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

暑期学习总结

iOS学习 前言无限轮播图换头像网络请求按钮的configuration属性总结 前言 经过暑期培训,完成了五个项目的仿写,在项目中将零散的内容经过实践学习,有了不少收获,因此来总结一下比较重要的内容。 无限轮播图 这是写项目的第一个难点,在很多项目中都有使用,越写越熟练。 原理为制造两个假页,在首和尾分别制作最后一页和第一页的假页,当移动到假页时,使用取消动画的方式跳到

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[

PHP7扩展开发之字符串处理

前言 这次,我们来看看字符串在PHP扩展里面如何处理。 示例代码如下: <?phpfunction str_concat($prefix, $string) {$len = strlen($prefix);$substr = substr($string, 0, $len);if ($substr != $prefix) {return $prefix." ".$string;} else