题目链接


题目大意:就是给你两个数a,ba,ba,b叫你求满足下面三个条件的c,d,e,fc,d,e,fc,d,e,f
1.cd−ef=ab1.{c\over d}-{e\over f}={a\over b}1.dc​−fe​=ba​
2.d<b&&f<b2.d<b\&\&f<b2.d<b&&f<b
3.c,e∈[1,4e12]3.c,e\in[1,4e12]3.c,e∈[1,4e12]


我们先将第一个式子通分c∗f−e∗dd∗f=ab{c*f-e*d\over d*f}={a\over b}d∗fc∗f−e∗d​=ba​
1.如果gcd(a,b)>1,那么a和b可以进一步化简:a1=a/gcd(a,b),b1=b/gcd(a,b);那么我们可以直接令d=b1,f=1,e=1,c=a1+b1;gcd(a,b)>1,那么a和b可以进一步化简:a_1=a/gcd(a,b),b1=b/gcd(a,b);那么我们可以直接令d=b_1,f=1,e=1,c=a_1+b_1;gcd(a,b)>1,那么a和b可以进一步化简:a1​=a/gcd(a,b),b1=b/gcd(a,b);那么我们可以直接令d=b1​,f=1,e=1,c=a1​+b1​;
2.如果gcd(a,b)=1,我们就不能像上面那样赋值了因为题目的第二个限制条件。gcd(a,b)=1,我们就不能像上面那样赋值了因为题目的第二个限制条件。gcd(a,b)=1,我们就不能像上面那样赋值了因为题目的第二个限制条件。因为a/ba/ba/b是最简的形式那么等式两边应该是对应相等的那么b=d∗f,a=c∗f−e∗db=d*f,a=c*f-e*db=d∗f,a=c∗f−e∗d,那么我们将bbb分解成d∗fd*fd∗f再去讨论a=c∗f−e∗da=c*f-e*da=c∗f−e∗d,这不就是扩展欧几里得算法吗?
3:如何分解bbb:通过分数的形式可以知道d和fd和fd和f是互质的,如果不互质通分后得式子上下相消分母就会变得比bbb小了
4.如何将b分解成两个互的数:我们可以运用欧拉筛的性质将每个数最小的质因数筛出来如何不断调整

 ll d = 1, f = b;int k = isnp[b];while(f % k == 0 && k != 1){f /= k;d *= k;}

a=c∗f−e∗da=c*f-e*da=c∗f−e∗d这个式子是一元方程值域为[−无穷到+无穷][-无穷到+无穷][−无穷到+无穷]我们只要随便一对d,f带入求c,e都一定有解
5.注意扩展欧几里的通解的处理,以及扩展欧几里得求出来的通解是c∗f−e∗d=gcd(d,f)=1c*f -e*d=gcd(d,f)=1c∗f−e∗d=gcd(d,f)=1的解答案记得要扩大aaa倍


#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define count Count
#define pb push_back
#define f first
#define s second
using namespace std;
const int N = 2e6+10, mod = 1e9 + 7;
const double eps = 1e-10;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}
int T, n;
int prime[N], cnt;
int isnp[N];
bool vis[N];
void init()
{isnp[1] = 1;for(int i = 2; i < N;  ++ i){if(!vis[i]){isnp[i] = i;prime[cnt ++] = i;}for(int j = 0; j < cnt && prime[j] * i < N; ++ j){vis[i * prime[j]] = true;isnp[i * prime[j]] = prime[j];if(i % prime[j] == 0) break;}}
}ll exgcd(ll a,ll b,ll &x,ll &y)//扩展欧几里得算法
{if(b==0){x=1;y=0;return a;  //到达递归边界开始向上一层返回}ll r=exgcd(b,a%b,x,y);ll temp=y;    //把x y变成上一层的y=x-(a/b)*y;x=temp;return r;     //得到a b的最大公因数
}int main()
{init();read(T);while(T --){ll a,b;read(a,b);ll G = __gcd(a,b);if(G > 1)cout << (a + b) / G << " " << b / G << " 1 1" << endl; else {ll d = 1, f = b;int k = isnp[b];while(f % k == 0 && k != 1){f /= k;d *= k;}if(d == b && f == 1) cout << "-1 -1 -1 -1" << endl;else {ll c,e;exgcd(f,d,c,e);e = -e;while(c <= 0 || e <= 0){c += d;e += f;}e *= a, c *= a;cout << c << " " << d << " " << e << " " << f << endl;}}}return 0;
}

exgcd ---- 2020牛客多校第三场:[Fraction Construction Problem:exgcd+思维题]相关推荐

  1. 2020牛客多校第三场[C Operation Love+基础计算几何 判断多边形顺逆时针]

    题目链接 题目大意:就是给你两个左右手的模型,下面给出这两只手通过平移变换之后坐标问你这只手是左手还是右手?[题目保证坐标是按照顺时针或者逆时针给出的] 解题思路:首先我们先观察一下这只右手:假如数据 ...

  2. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

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

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

  4. 牛客多校第三场A【Clam and fish】贪心

    A[Clam and fish]贪心 链接:https://ac.nowcoder.com/acm/contest/5668/A 来源:牛客网 题目: There is a fishing game ...

  5. Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表

    题目链接 题目大意: 就是每次把牌堆中若干个连续的牌放到堆顶,问你最后牌的序列. 解题思路: Splay 区间翻转的模板题: 对于一个区间[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7 ...

  6. 2020牛客多校第1场H-Minimum-cost Flow

    解题思路: 首先我们要从费用流mcmf的算法入手:因为它每次增广是再费用增广路上跑的,根据贪心的思想费用小的路基本上能运多少就尽量运多少,所以我们可以假设初始的边容量是1,只跑一遍mcmf.记录一下每 ...

  7. 数论分块 ---- 2020牛客多校第7场H-Dividing[思维+数论分块]

    题目大意: 解题思路:很明显满足条件的点是n%k==0∣∣n%k==1n\%k==0||n\%k==1n%k==0∣∣n%k==1 1.因为nnn是从111开始的如果一直乘以k[n=n∗k]k[n=n ...

  8. 2020牛客多校第7场C-A National Pandemic[树链剖分+思维]

    题目大意 1.首先我们看一下操作1:实际上可以说成在所有位置上加上w−dist(x,y)w-dist(x,y)w−dist(x,y),因为dist(x,x)=0dist(x,x)=0dist(x,x) ...

  9. 2020牛客多校第5场B-Graph完全图异或最小生成树

    因为这里边是可以任意加的但是要保证联通性所有这里可以看成一个完全图,每条边的权值=a[u]^a[v] 1.那么我们可以将每个点的权值sort一遍,将每个a[i],从高位到低位,按照最高位的1出现的顺序 ...

最新文章

  1. 明日开播 | 7 场不可错过的 AI 技术专题
  2. [CVPR 2016] Weakly Supervised Deep Detection Networks论文笔记
  3. Castle ActiveRecord 泛型应用
  4. 关于eclipse的实用技巧
  5. LeetCode 370. 区间加法(差分思想)
  6. Table被web编程弃用的原因
  7. android sdk system images,ADT中使用Android SDK Manager安装X86的System Image | 在路上
  8. VB判断指定名字的进程是否存在函数
  9. 腾讯云数据库智能化海量运维的建设与实践
  10. jQuery Ajax async=false异步改为同步时,导致浏览器假死的处理方法
  11. 南怀瑾讲述99个人生道理
  12. 原生JS调取PC端摄像头源码记录
  13. SLG手游卡牌类游戏机器人逻辑算法
  14. spyder pyecharts不显示_逆袭的IGZOIPS!微星电竞显示器新品评测:色彩好且拖影少...
  15. 8.2 JVM命令行监控——jstat
  16. matlab 实现常用的混沌映射(Tent, Sine, Sinusoidal, Piecewise, Logistic, Cubic, Chebyshev)
  17. myeclipse崩溃闪退解决方案
  18. 打造最小的XP系统180M
  19. 爬百度贴吧并保存链接
  20. PS CC2019中英文切换方法

热门文章

  1. 利用python将数据写入CSV文件中
  2. IaaS, PaaS和SaaS是云计算的三种服务模式
  3. 综述|计算机视觉中的注意力机制
  4. 卡尔曼滤波:究竟滤了谁?
  5. P2055 [ZJOI2009]假期的宿舍
  6. PO、VO、FormBean的思考
  7. 医疗信息安全再添新保障
  8. 【安全牛学习笔记】字典、在线密码破解-hydra
  9. BNUOJ34980方(芳)格(哥)取数(好坑)
  10. 基于Python的HTTPS协议模拟登陆+爬取页面