二元一次不定方程

定义: a,b,c是整数,且ab!=0,那么形如ax+by=c的方程称为二元一次不定方程

定理1: 设a,b是整数且 d = gcd(a,b) 如果d|c,那么返程存在无穷多个整数解,否则不存在整数解。

这里大概可以发现二元一次不定方程和同余方程可以相互转化,如在a>0且b>0的条件下,求二元一次方程ax+by=c整数解等价于求一元线性同余方程ax≡c(mod b)的整数解。

给出poj 2142这个题练练手

The Balance

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 5225   Accepted: 2297

Description

Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspirin using 300mg weights and 700mg weights, she can put one 700mg weight on the side of the medicine and three 300mg weights on the opposite side (Figure 1). Although she could put four 300mg weights on the medicine side and two 700mg weights on the other (Figure 2), she would not choose this solution because it is less convenient to use more weights. 
You are asked to help her by calculating how many weights are required. 

Input

The input is a sequence of datasets. A dataset is a line containing three positive integers a, b, and d separated by a space. The following relations hold: a != b, a <= 10000, b <= 10000, and d <= 50000. You may assume that it is possible to measure d mg using a combination of a mg and b mg weights. In other words, you need not consider "no solution" cases. 
The end of the input is indicated by a line containing three zeros separated by a space. It is not a dataset.

Output

The output should be composed of lines, each corresponding to an input dataset (a, b, d). An output line should contain two nonnegative integers x and y separated by a space. They should satisfy the following three conditions.

  • You can measure dmg using x many amg weights and y many bmg weights.
  • The total number of weights (x + y) is the smallest among those pairs of nonnegative integers satisfying the previous condition.
  • The total mass of weights (ax + by) is the smallest among those pairs of nonnegative integers satisfying the previous two conditions.

No extra characters (e.g. extra spaces) should appear in the output.

Sample Input

700 300 200
500 200 300
500 200 500
275 110 330
275 110 385
648 375 4002
3 1 10000
0 0 0

Sample Output

1 3
1 1
1 0
0 3
1 1
49 74
3333 1

Source

Japan 2004

用扩展欧几里的解决问题。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 int gcd(int a,int b)
 8 {
 9     if(b == 0) return a;
10     else return gcd(b,a%b);
11 }
12
13
14 int ex_gcd(int a,int b,int &x,int &y)
15 {
16     if(b == 0){
17         x = 1;
18         y = 0;
19         return a;
20     }
21     else {
22         ex_gcd(b,a%b,x,y);
23         int t = x;
24             x = y;
25             y = t - a/b*y;
26             return t;
27     }
28 }
29
30 int main()
31 {
32     int a,b,c,x,y;
33     while(scanf("%d%d%d",&a,&b,&c)!=EOF){
34         if(a == 0 && b == 0 && c == 0) break;
35         int d = gcd(a,b);
36         a /= d;
37         b /= d;
38         c /= d;
39         ex_gcd(a,b,x,y);
40         int xx = x*c;
41         xx = (xx%b+b)%b;
42         int yy = (c - a*xx)/b;
43         if(yy < 0) yy = -yy;
44         y = y*c;
45         y = (y%a+a)%a;
46         x = (c - b*y)/a;
47         if(x < 0) x = -x;
48         if(x+y > xx+yy){
49             x = xx;
50             y = yy;
51         }
52         printf("%d %d\n",x,y);
53     }
54
55     return 0;

时间: 2024-10-13 12:19:56

二元一次不定方程的相关文章

二元一次不定方程和最大公约数笔记

问题描述: 1)求满足ax+by=gcd(a,b)的x,y整数解. 2)形如ax+by=gcd(a,b)的二元一次不定方程有没有整数解 3)如果有解,如何求解 4)有多少个解,能否用一个公式来形式化描述所有解. 5)用计算机求解 求解22x+60y=gcd(22,60)=2: 首先利用欧几里得算法求解gcd(22,60).如下 设a=60,b=22. a=60=2*22+16;  移项: 16=a-2*22=a-2b; b=22=1*16+6;   移项:  6=b-16=b-(a-2b)=3b

【数学】解方程

简而言之,本题任务就是解方程.共有两个子任务. 子任务 1:小学生 作为小学生,我们只会解一元一次方程,一元一次方程最终都可以化为 ax=n 的形式.现在问:对于给定的 n,要使得 x 有正整数解,总共可以取多少个不同的 a 呢? 子任务 2:中学生 作为中学生,我们只会解二元一次不定方程,二元一次不定方程最终都可以化为 ax+by=n 的形式.现在问:对于给定的 n,要使得 x,y 有正整数解,总共可以取多少对不同的 (a,b) 呢? Input 输出一行两个整数 q,n (q∈{1,2}).

扩展欧几里德伪代码

求解二元一次不定方程 mx + ny = gcd(m, n) 1 int ex_gcd(int m, int n, int &x, int &y) 2 { 3 if (n == 0) { 4 x = 1; 5 y = 0; 6 return m; 7 } 8 int tmp, g; 9 g = ex_gcd(n, m % n, x, y); 10 tmp = x; 11 x = y; 12 y = tmp - m / n * y; 13 return g; 14 }

组合数取模(转载)

本文转自:http://blog.csdn.net/skywalkert/article/details/52553048 0. 写在前面 在程序设计中,可能会碰到多种类型的计数问题,其中不少涉及到组合数的计算,所以笔者写下这么一篇文章,期望能解决一些常规的组合数求模问题.以下部分内容改编自AekdyCoin的<组合数求模>,而且为了感谢他对(懵懂的)笔者的启发,这篇文章的标题与其文章相同.另外,感谢Picks将多项式运算的技巧在中国进行推广,感谢51nod提供了许多有趣的数论题目,感谢fot

数论 Note.

最近从老师那里get到一本书<数学一本通>,名字很成功学的一本书,刚开始很不想看,但是翻了一下前几章东西好像干货很多而且讲的很通俗.数学的东西杂七杂八,所以感觉有必要开贴记一下东西,不定时更新. 1. 2.如果一个数的后n位能被整除,那么这个数能被整除. 3.如果一个数的各位数之和能被3,9整除,那么这个数能被3,9整除 4.如果一个数的奇数位与欧数位之差能被11整除,那这歌数能被11整除 5.如果一个数的末三位和末三位之前的数字组成的数的差能被7,11,13整除,那么这个数能被7,11,13

RSA

一:费马小定理:假若 p为质数,a为任意正整数,那么 ap-a可被 p 整除 二:欧拉函数:假若 a与 n 互质,那么  aΦ(n)-1可被  整除.亦即,aΦ(n)≡1(mod n) 1:如果n=1,则 Φ(1) = 1 .因为1与任何数(包括自身)都构成互质关系. 2:如果n是质数,则 Φ(n)=n-1 .因为质数与小于它的每一个数,都构成互质关系.比如5与1.2.3.4都构成互质关系. 3:如果n是质数的某一个次方,即 n = pk (p为质数,k为大于等于1的整数),则 Φ(pk)=pk

【数论】扩展欧几里得算法

扩展欧几里得     上回刚写完欧几里得,那现在还有一个东西叫拓展欧几里得:     扩展欧几里得法是一个在求解同余方程等问题上的一个很好的方法,其具体功能如下:     在已知(a,b)时,求解一组(p,q)使得p*a+q*b=GCD(a,b)          首先,根据数论中的原理,解一定是存在的.     我们可以设a对于GCD(a,b)的倍数是k,b对于GCD(a,b)的倍数是l     那么p*(GCD(a,b)*k)+q*(GCD(a,b)*l)=GCD(a,b)     可以推出

转:转一个搞ACM需要的掌握的算法. .

要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.  适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红,  发挥自己的长处,这才是重要的. 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,  因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打  出来.  1.最短路(Floyd.Dijstra,BellmanFord)  2.最小生成树(先写个prim,kruscal要用并查集,不好写)

[POJ3696]The Luckiest number(数论)

题目:http://poj.org/problem?id=3696 题意:给你一个数字L,你要求出一个数N,使得N是L的倍数,且N的每位数都必须是8,输出N的位数(如果不存在输出0) 分析: 首先我们假设N是x个8组成的 那么88888...888=kL 提个8出来:8*111..1111=kL ① 因为题目只要求x的值,所以要弄出关于x的方程 11...111可以写成(10^k-1)/9 于是①变成了8(10^x-1)=9kL ② 再来回顾下题目,②式中x和k是变量,且都属于正整数,要根据②式