题目链接:点击查看

题目大意:给出 a 和 b ,求解满足条件的 c,d,e,f ,使得:

  1. d < b
  2. f < b
  3. c,e 均为小于等于 4e12 的正整数

题目分析:分情况讨论一下,首先如果 a 和 b 可以约分的话,那么直接约分后,输出 a+1 , b , 1 , b 显然就是答案了,如果不能约分的话,且 b 的相异质因子的个数不超过 1 个的话,那么是无解的,证明如下:(来自官方题解)

最后一种情况就是 b 的相异质因子个数超过一个,对于这种情况可以将条件 1 的公式转换一下: 

这样一来,d 和 f 显然就是 b 的两个相异质因子了,而 cf - de = a ,在已知 d 和 f 的前提下,一定有解,且可以用扩展欧几里得来解决,注意最后求出来的答案需要处理一下,因为需要保证 c 和 e 为正整数

在找 d 和 f 的时候也有技巧,如果 sqrt( n ) 暴力去找的话,会超时,所以可以用埃氏筛预处理一下,保存一下每个数字的最大质因子,这样就可以令 d 为该质因子的幂,然后 f = b / d 了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e6+100;int pri[N];//pri[i]:i的最大质因子为pri[i]template<class T> void exgcd(T a,T b,T &d,T &x,T &y){if(!b) {d=a;x=1;y=0;}else {exgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
//求解二元一次方程 a*x+b*y=c,一组解为x,y,无解则返回false
template<class T> bool Solve_equation(T a,T b,T c,T &x,T& y){T gcd;exgcd(a,b,gcd,x,y);if(c%gcd) return false;   //无解T k=c/gcd;x*=k;y*=k;T xplus=b/gcd,yplus=a/gcd; if(xplus<0) xplus*=-1;if(yplus<0) yplus*=-1;//此时求出的x,y即为一组解,该方程的通解形式为X=x+t*(b/gcd),Y=y-t*(a/gcd) t为任意正整数//根据题目要求我们需要构造特殊解//x=(x%xplus+xplus)%xplus;y=c-a*x; //x的最小正整数解//y=(y%yplus+yplus)%yplus;x=c-b*y; //y的最小正整数解return true;
}void init()
{pri[1]=1;for(int i=2;i<N;i++)if(!pri[i])//当前的数为质数for(int j=i;j<N;j+=i)pri[j]=i;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int w;cin>>w;while(w--){LL a,b;scanf("%lld%lld",&a,&b);LL gcd=__gcd(a,b);a/=gcd,b/=gcd;if(gcd!=1){printf("%lld %lld %lld %lld\n",a+1,b,1,b);continue;}LL d=1,f=b;while(pri[b]!=1&&f%pri[b]==0){f/=pri[b];d*=pri[b];}if(f==1)//只有一个质因子 {printf("-1 -1 -1 -1\n");continue;}LL c,e;Solve_equation(f,-d,a,c,e);LL k=abs(min(c/d,e/f))+1;c+=d*k,e+=f*k;printf("%lld %lld %lld %lld\n",c,d,e,f);}return 0;
}

牛客多校3 - Fraction Construction Problem(扩展欧几里得)相关推荐

  1. 牛客多校4 - Harder Gcd Problem(构造+贪心)

    题目链接:点击查看 题目大意:给出一个 n ,表示 1 ~ n 的 n 个数字,现在要求选出尽可能多的两两匹配,使得每组匹配的 gcd 都大于 1,输出最多能有多少组匹配,以及方案 题目分析: 这样的 ...

  2. 牛客多校4 - Basic Gcd Problem(预处理质因子的个数)

    题目链接:点击查看 题目大意:给出一个函数,有 t 次询问,每次询问给出相应的参数,要求计算函数值 题目分析:打个表不难将函数化简为: ,x 为 n 中的质因子个数,而质因子的个数可以 n * sqr ...

  3. 牛客网递归错题:递归、欧几里得求最大公约数的时间复杂度、线性递归与尾递归实例区别

    很久找不到学习的平衡点,似乎有目的性的去解决问题寻求方法获得知识会比直接吸取知识要有趣,更印象深刻,这些都是我爬过的坑,以此铭记在心. 1. 队列在程序调用时必不可少,因此递归离不开队列.× 递归是栈 ...

  4. 牛客多校第四场【B-Basic Gcd Problem】

    牛客多校第四场[B-Basic Gcd Problem] 题目链接:https://ac.nowcoder.com/acm/contest/5669/B 思路:先要理解公式,多看几个数据基本就会有点想 ...

  5. 牛客多校第三场 B【Classical String Problem】

    牛客多校第三场 B[Classical String Problem] 链接:https://ac.nowcoder.com/acm/contest/5668/B 来源:牛客网 题目描述 Given ...

  6. 2022牛客多校(十)

    2022牛客多校(十) 一.比赛小结 比赛链接:"蔚来杯"2022牛客暑期多校训练营10 二.题目分析及解法(基础题) F.Shannon Switching Game? 题目链接 ...

  7. 牛客多校三 B Black and white

    牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...

  8. Knapsack Cryptosystem(2019牛客多校折半查询)

    链接:https://ac.nowcoder.com/acm/contest/889/D 来源:牛客网 Amy asks Mr. B problem D. Please help Mr. B to s ...

  9. Fraction Construction Problem(拓展欧几里德)

    Fraction Construction Problem 思路 cd−ef=ab\frac{c}{d} - \frac{e}{f} = \frac{a}{b}dc​−fe​=ba​ a<b&a ...

最新文章

  1. 开发函数计算的正确姿势——支持 ES6 语法和 webpack 压缩
  2. mysql 查询任务_mysql中怎样显示服务器正在执行的sql任务
  3. 基于 Linux Bridge 的 Neutron 多平面网络实现原理
  4. ARM开发培训的总结报告
  5. python链表怎么定义_python:链表定义以及实现
  6. html5编辑器新手用,3款容易上手的HTML5编辑工具推荐~
  7. java new string作用_java中直接new String对象?
  8. linux桌面环境与窗口管理器,窗口管理器和桌面环境的区别 | MOS86
  9. java JDK 自带的 native2ascii 和它的 reverse 命令
  10. 深入剖析WebRTC事件机制之Sigslot
  11. Python笔记_第五篇_Python数据分析基础教程_文件的读写
  12. Cheat Engine CE官方教程 [汉化]
  13. 按键精灵易语言c,易语言插件按键精灵调用方法
  14. 文档处理 - 复杂Excel文档
  15. 禁止QQ迷你首页运行【转】
  16. SwiftUI vs 故事板
  17. vue-cli在webpack环境下怎样生成开发环境模板(适合初学者)
  18. Linux设备类型有哪些?
  19. java实现上传文件夹
  20. 数据中台,我还能爱你吗(文末送书)

热门文章

  1. Jasypt 加密-整合SpringBoot
  2. MySQL高级 - insert优化
  3. 索引方式:真的是用的B+Tree 吗?
  4. 任务执行者EventLoop
  5. JMM如何解决顺序一致性问题-JMM层面的内存屏障
  6. 函数式接口的概念函数式接口的定义
  7. 常见问题_空指针异常
  8. Java高并发程序设计前言
  9. 手动使用cglib代理(了解)
  10. SpringMVC+Spring+mybatis