博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu2669与hdu1576(扩展欧几里德)
阅读量:6648 次
发布时间:2019-06-25

本文共 2038 字,大约阅读时间需要 6 分钟。

模板:

 

int Extend_Euclid(int a, int b, int &x, int &y){

        if(b == 0){
            x = 1; 

            y = 0;

            return a;
        }
        else{
            int gcd,t;
            gcd = Extend_Euclid(b, a%b, x, y);
            t = x;
            x = y;
            y = t - (a / b) * y;
            return gcd;
        }

    }

详见:

hdu 2669

 

Sample Input
77 51 10 44 34 79
 

 

Sample Output
2 -3 sorry 7 -3

 

 

求 a*x + b*y = 1。输出一个正数x,一个y。

直接套模板,最后对x < 0时处理一下,∵a*x + b*y = 1,所以x+=b,y-=a来保持值不变

#include 
#include
#include
#include
#include
#include
#include
typedef long long ll;typedef unsigned long long ull;using namespace std;const int N=100050;ll ex_gcd(ll a,ll b,ll &x,ll &y) //扩展欧几里德{ if(b ==0) { x = 1;y = 0; return a; } else { ll t = ex_gcd(b,a%b,y,x); y = y - x*(a/b); return t; }}int main(){ ll a,b; while(scanf("%I64d%I64d",&a,&b)!= EOF) { ll x,y; ll tmp = ex_gcd(a,b,x,y); if(1 % tmp) printf("sorry\n"); else { while(x < 0){ x += b; y -= a; } printf("%I64d %I64d\n",x,y); } } return 0;}

  

hdu 1576

 

Problem Description
要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。
 

 

Input
数据的第一行是一个T,表示有T组数据。
每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。
 

 

Output
对应每组数据输出(A/B)%9973。
 

 

Sample Input
2 1000 53 87 123456789
 

 

Sample Output
7922 6060

 

 

A % B = 0,A= Bx;

n = A%9973  , A  = 9973y + n;   Bx -9973y  = n;

GCD(b,9973) = 1,      b*x1 + 9973y1 = 1,    b*x1*n + 9973 *(n*y1) = n

∴ x = n*x1,  x1可以通多exGCD算出

最后的x通过    (x % MOD + MOD)%MOD 防止出现负数

#include 
#include
#include
#include
#include
#include
#include
typedef long long ll;typedef unsigned long long ull;using namespace std;const int N=100050;void ex_gcd(int a,int b,int &x,int &y) //扩展欧几里德{ if(b ==0) { x = 1;y = 0; } else { ex_gcd(b,a%b,y,x); y = y - x*(a/b); }}int main(){ int T; scanf("%d",&T); while(T--) { int n,B; scanf("%d%d",&n,&B); int x,y; ex_gcd(B,9973,x,y); x *= n; printf("%d\n",(x%9973 + 9973)% 9973); //再加上一次,防止负 } return 0;}

  

 

转载于:https://www.cnblogs.com/Przz/p/5409793.html

你可能感兴趣的文章
UNIX网络编程——处理服务器中大量的TIME_WAIT
查看>>
添物不花钱学计算机及编程(预备篇) - 软件工程
查看>>
带状态论文粗读(三)[引用openstate的相关论文阅读]
查看>>
pcDuino无显示器刷机与使用
查看>>
程序员出路在何方
查看>>
linux-alias基本用法
查看>>
compose函数
查看>>
Professional C# 6 and .NET Core 1.0 - Chapter 39 Windows Services
查看>>
C# 6 与 .NET Core 1.0 高级编程 - 40 ASP.NET Core(上)
查看>>
(已解决)Xcode 运行cocos2dx弹出内部错误对话框(Internal Error)
查看>>
J2EE 13规范(2)-JNDI
查看>>
模板维护-模板测试
查看>>
django -- 对模式进行调式(pay with the api)
查看>>
SQL Server sp_configure 控制内存使用
查看>>
通读《构建之法》提出问题
查看>>
VB生成xml
查看>>
左值、左值引用、右值、右值引用
查看>>
中转注入
查看>>
ACM 算法目录
查看>>
android 读取SD卡文件
查看>>