http://acm.hdu.edu.cn/showproblem.php?pid=2669

扩展欧几里德。

扩展欧几里德: 给一个线性方程X*a+Y*b=m,给出a,b,m让求解X和Y。

首先,只有m%gcd(a,b)==0 时 该线性方程才有解。

假使a=k1 *gcd(a,b),b=k2 * gcd(a,b);

那么方程左边就等于(X*k1+Y*k2)*gcd(a,b),所以仅当m能被gcd(a,b)整除时方程才有解。

为了求上述方程的解,我们不妨先来求方程a*X+b*Y=gcd(a,b)的解,设d=m/gcd(a,b);

所以a*(d*X)+b*(d*y)=d*gcd(a,b)=m,求出这个方程的解原方程的解也就求出了。

根据欧几里德有gcd(a,b)=gcd(b,a%b)

所以a*X+b*Y=gcd(a,b)=gcd(b,a%b)=b*X1+(a%b)*Y1;

令k=a/b , r=a%b

a=b*k+r;

得出X=Y1 ,  Y=X1-Y1*(a/b);

__int64 X,Y; //全局变量

void extend_GCD(__int64 a,__int64 b)
{

    __int64
X1,Y1;
    if
(b==0)
    {

        X=1;
        Y=0;
        return
;
    }

    extend_GCD(b,a%b);
    X1=Y;
    Y1=X-Y*(a/b);
    X=X1;
    Y=Y1;
}

这样X*d,Y*d就是原方程的一组解。

满足方程的解有无数多个,a*(X + n*b) + b*(Y - n*a)=m; n=(...-2,-1,0,1,2...);

一般是让求最小的X并且X>=0,我们只需找X,每一个X都对应唯一的一个Y.

X所以最后的解为X%b,如果为负数就再加b

View Code

 1 # include<stdio.h>
 2 # include<string.h>
 3 # include<stdlib.h>
 4 __int64 X,Y;
 5 __int64 gcd(__int64 a,__int64 b)
 6 {
 7     __int64 tmp;
 8     while(a%b)
 9     {
10         tmp=a%b;
11         a=b;
12         b=tmp;
13     }
14     return b;
15 }
16 void extend_GCD(__int64 a,__int64 b)
17 {
18     __int64 X1,Y1;
19     if(b==0)
20     {
21         X=1;
22         Y=0;
23         return;
24     }
25     extend_GCD(b,a%b);
26     X1=Y;
27     Y1=X-Y*(a/b);
28     X=X1;
29     Y=Y1;
30 }
31 int main()
32 {
33     __int64 d,a,b;
34     while(scanf("%I64d%I64d",&a,&b)!=EOF)
35     {
36         d=gcd(a,b);
37         if(d!=1) {printf("sorry\n");continue;}
38         extend_GCD(a,b);
39         X=X%b;
40         if(X<0) X+=b;
41         Y=(1-X*a)/b;
42         printf("%I64d %I64d\n",X,Y);
43     }
44     return 0;
45 }

转载于:https://www.cnblogs.com/183zyz/archive/2012/09/05/2671481.html

hdu 2669 Romantic相关推荐

  1. hdu 2669 Romantic

    http://acm.hdu.edu.cn/showproblem.php?pid=2669 这是一道纯模板的扩展GCD,直接求a*x+b*y=1就可以了,我们直接用模板,不过还要注意数的大小超过in ...

  2. Romantic(hdu 2669)

    Romantic 扩展欧几里德算法.a*x1+b*y1=1 ; 代码: #include<iostream> #include<cstdio> using namespace ...

  3. 扩展欧几里德算法详解

    转自:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两 ...

  4. vbox共享文件夹 linux,Vbox下创建Linux和Windows的共享文件夹

    我的Vbox版本是4.3.6...在这里以win8和Ubuntu12.04之间共享文件举例 首先运行虚拟机,然后安装增强功能..这个增强功能很碉堡...能开启无缝模式和系统间的剪贴板共享等牛X功能 然 ...

  5. HDOJ 2642 HDU 2642 Stars ACM 2642 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋   题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2642 题目描述: ...

  6. HDU 5643 King's Game 打表

    King's Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5643 Description In order to remember hi ...

  7. 2014多校联合四(HDU 4901 HDU 4902 HDU 4905)

    HDU 4901 The Romantic Hero 题意: 一串数字a  找一个位置分开  前面为S'后面为T'  从这两个集合中分别选出子集S和T  使得S中元素的"异或"值等 ...

  8. Romantic(拓展欧几里得)

    Romantic 点我找原题 直接用拓展欧几里得公式求出x和y,再除以a,b的最大公约数q,如果依然是整数,则输出,否则,x+=b,y-=a,再判断 一次,直到x和y都能被q整除,如果100次后还不能 ...

  9. HDU——1106排序(istringstream的使用、STLvector练习)

    排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

最新文章

  1. C# Attribute简介
  2. 打印当前时间 毫秒_时间轮定时器
  3. 正则表达式强化,爬虫练习
  4. Tensorflow2.0开启,从此忘记1.*版本
  5. SQL转换全角和半角函数
  6. 数据库 memorial
  7. thinkPHP定义路由
  8. 浅析Linux下的task_struct结构体
  9. redis5 外部不能连接_基本拧紧技术,螺纹连接也有大不同!
  10. 计算机应用网络工程师的英文名字,网络工程师英文简历
  11. vue 一周日历展示,上一周下一周展示。
  12. matlab 盲源信号分离,基于盲源分离的图像噪声滤除的研究(附Matlab仿真程序)☆
  13. 北京玉渊潭公园第二十届樱花节
  14. android data com.qzone,我手机是安卓系统的,Qzone里的FileCache文件夹中的文件是什么东西?...
  15. 渗透bc网站教学_督导引领共交流 听课评课共成长 怀化锦溪小学开展课堂教学督导听课活动_都市新闻_新闻中心...
  16. 让机器认知中文实体 — 复旦大学知识工场发布中文实体识别与链接服务
  17. C++初级主题--名字空间域和类域
  18. [已解决]Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()'
  19. Unity3D VideoPlayer播放视频和音频
  20. 通过AI实现实时数据分析和态势监测,进而让机器能够处理日常决策

热门文章

  1. python怎么输出结果_如何在python中打印SQLite查询的结果?
  2. 东软信息学院java试题,东软Java笔试题答案
  3. matlab 图像中用text文字标注
  4. 统计上报---日志上报成功率高的方式
  5. 编写高质量JavaScript代码的基本技巧
  6. OSChina 周六乱弹 —— 这辈子最丢脸的事
  7. CentOS 6.5安全加固及性能优化
  8. 【转】Jquery -Ajax 入门练习 Jquery.Ajax 调用后台函数,获取DataTable Json,Asp.net
  9. 转:QQ圈子:社交神器还是隐私魔鬼?
  10. 有史以来的第一个脚本 找出三个数的最大数字