扩张欧几里得

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#define ll long long

using namespace std;

ll ext_gcd(ll a, ll b, ll &p, ll &q)
{
    ll t, r;

    if(!b){
        p = 1;
        q = 0;
        return a;
    }
    r = ext_gcd(b,a%b,p,q);
    t = p;
    p = q;
    q = t -(a/b)*q;
    return r;
}

int main()
{
    ll x, y, n, m, l;
    ll t, a, b, d, r, c;
    ll p, q;

    scanf("%lld %lld %lld %lld %lld",&x,&y,&n,&m,&l);
    a = n-m;
    c = y-x;
    b = l;
    d = ext_gcd(a,b,p,q);
    if(c%d != 0)
        printf("Impossible");
    else {
        p = p*(c/d);
        p = (p%b+b)%b;
        printf("%lld\n",p);
    }
    return 0;
}

扩张欧几里得

时间: 2024-10-05 02:49:39

扩张欧几里得的相关文章

扩张欧几里得模板

1 /************************************* 2 3 扩展欧几里得模板 4 给出ax+by=gcd(a,b)求gcd(a,b),x,y. 5 gcd(a,b)为a,b的最大公约数. 6 7 *************************************/ 8 9 #include<iostream> 10 using namespace std; 11 12 ///扩展gcd,可以求出gcd(a,b)以及ax+by=gcd(a,b)中x,y的值

UVa 11768 格点判定(扩展欧几里得求线段整点)

https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后对于扩展欧几里得有了全面的了解. 根据两点式公式求出直线 ,那么ax+by=c 中的a.b.c都可以确定下来了. 接下来首先去计算出一组解(x0,y0),因为根据这一组解,你可以写出它的任意解,其中,K取任何整数. 需要注意的是,这个 a' 和 b' 是很重要的,比如说 b' ,它代表的是x每隔 b

UVA - 1347 Tour 双调欧几里得旅行商问题

题目大意:给出n个点,要求你从最左边那个点走到最右边那个点,每个点都要被遍历过,且每个点只能走一次,问形成的最短距离是多少 解题思路:用dp[i][j]表示第一个人走到了第i个点,第二个人走到了第j个点且已经遍历了1–max(i,j)的所有点的最短距离.因为dp[i][j] = dp[j][i]的,所以我们设i > j的 那么就有 当j < i-1 时,dp[i][j] = dp[i-1][j] + dis(i, i -1) 当j == i + 1时情况就比较特别了,这里将j用i-1代替 dp

【算法学习】双调欧几里得旅行商问题(动态规划)(转)

双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这个解的一般形式为NP的(在多项式时间内可以求出) J.L. Bentley 建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点.下图(b)显示了 同样的7个点的最短双调路线.在这种情况下,多项式的算法是可能的.事实上,存

【扩展欧几里得】BZOJ1477-青蛙的约会

一直在WA,后来我发现我把东西看反了-- [题目大意] 给出一个长度为L的环状坐标轴,两个点开始时位于(X,0).(Y,0).每次两点分别往右边移动m和n,问能否相遇? [思路] 由题意,可得: X+mt=Y+nt(mod L) (X+mt)-(Y+nt)=L*k (n-m)t+L*k=X-Y. 可以用扩展欧几里得来做.具体来说,显然要满足n-m和L的最大公约数(记为d)要整除X-Y,否则无解.这个可以在扩展欧几里得中求出. 式子可以化简为:[(n-m)/d]*t+(L/d)*k=(X-Y)/d

POJ 1061 青蛙的约会 扩展欧几里得

扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; ll exgcd(ll a, ll b, ll&x, ll&y) { if (b ==

NYOJ 欧几里得

描述 已知gcd(a,b)表示a,b的最大公约数. 现在给你一个整数n,你的任务是在区间[1,n)里面找到一个最大的x,使得gcd(x,n)等于1. 输入 输入文件的第一行是一个正整数T,表示有T组测试数据 接下来有T行,每行有一个正整数n (1<=n<=10^1000). 输出 每组测试输出要求x. 样例输入 2 4 7 样例输出 3 6 这题从头至尾就是个坑.题目说的是“欧几里得”,结合题目,很容易让人马虎,按照欧几里得算法解题.但是认真读题的话,不难发现 n 的范围,是一个大数问题.一句

bzoj4517: [Sdoi2016]排列计数--数学+拓展欧几里得

这道题是数学题,由题目可知,m个稳定数的取法是Cnm 然后剩下n-m本书,由于编号为i的书不能放在i位置,因此其方法数应由错排公式决定,即D(n-m) 错排公式:D[i]=(i-1)*(D[i-1]+D[i-2]); 所以根据乘法原理,答案就是Cnm * D(n-m) 接下来就是怎么求组合数的问题了 由于n≤1000000,因此只能用O(n)的算法求组合,这里用乘法逆元(inv[])来辅助求组合数 即 Cnm = n! / ((n-m)! * m!) = fac[n]*inv[n-m]*inv[

数论之拓展欧几里得求解不定方程和同余方程组(一)

今天接到scy的压缩包,开始做数论专题.那今天就总结一下拓展欧几里得求解不定方程和同余方程组. 首先我们复习一下欧几里得算法: 1 int gcd(int a,int b){ 2 if(b==0) return a; 3 return gcd(b,a%b);4 } 拓展欧几里得算法: 推导过程: 给出A和B,求它们的最大公约数,并且求出x和y,满足Ax+By=gcd(A,B). 当A=0时,x=0,y=1; 当A>0时, 因为exgcd(A,B,x,y)表示Ax+By=gcd(A,B) 而且ex