数论专题---除法表达式之高精度运算,扩展欧几里得算法

【题意描述】

给定这样一个表达式:X1/X2/X3/·····/Xk,其中Xi是正整数。除法表达式应到按照从左到右的顺序求和。但在表达式中嵌入括号可以改变计算顺序。输入表达式,判断是否可以通过加括号使得表达式最后的值为整数。

【分析】

表达式可以写成E=(X1·X3·····Xk)/X2;(X1一定在分子位置,X2一定在分母位置,其它任意)

问题变为E是否为整数。

对于大数相乘,我们可以采用两种方法避免数据溢出:

1.采用素数的唯一分解定理;存储可能存在素数的个数(如何存储,用一个数组就行)

2.采用公式直接约分的形式(用分子中的每一个数据和x2约分,如果最后x2能够变为1,那么表达式一定为整数,否则不为整数。

问题推广:

对于求a和b的最小公倍数如何求?(a和b都很大)

我们知道有这个公式:a*b=gcd(a,b)*lcm(a,b)

那么我们可以得到lcm(a,b)=a*b/gcd(a,b)。但是问题来了,a*b必定溢出。我们可以变换一种形式来写:lcm(a,b)=a/gcd(a,b)*b;那么数据就不会溢出了。

【题意描述】

求直线ax+by+c=0上有多少个整点(x,y)满足x在区间[x1,x2]且y在区间[y1,y2]内?

扩展欧几里得算法程序代码为:

void gcd(int a,int b,int &d,int &x,int &y)
{
    if(!b) {d=a;x=1;y=0;}
    else
    {
        gcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}

那么我们可以得到:

1.设a,b,c为任意整数。若方程ax+by=c的一组整数解为(x0,y0),则它的任意整数解都可以写成(x0+kb‘,y0-ka‘)。其中a‘=a/gcd(a,b),b‘=b/gcd(a,b)。k为任意整数。

2.设a,b,c为任意整数,g=gcd(a,b)。方程ax+by=g的一组整数解是(x0,y0)。则当c是g的倍数时ax+by=c有一组整数解(x0c/g,y0c/g).

时间: 2024-10-19 23:00:43

数论专题---除法表达式之高精度运算,扩展欧几里得算法的相关文章

简单数论总结2——同余方程与扩展欧几里得算法

在上一次总结过后鸽了没多久其实是快要开学赶紧来肝上两篇 今日内容--同余方程和扩展欧几里得算法 同余 同余的定义:若存在两个整数a,b,使得(a - b) MOD P为0,则称作a与b在MOD P的情况下同余 换种通俗的说法,就是,a MOD P与b MOD P相等 记作  \( a\equiv b (mod P) \) 对于整数a,b,c和自然数m,n 同余具有以下性质: 自反性:\( a\equiv a (mod P) \) 对称性:若存在\( a\equiv b (mod P) \) ,则

POJ 1061 青蛙绕地球约会-数论-(解一元一次同余方程+扩展欧几里得算法)

题意:两只青蛙同向跳,起点是x,y,每次分别跳m,n米,地球周长是L,求最少跳几次相遇. 分析: 把式子写好就发现是一个一元一次同余方程.用扩展欧几里得算法来求.这题很基本得会. 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<queue> #define INF 100000

POJ 2115 for求循环次数-数论-(同余方程+扩展欧几里得算法)

题意:给定for循环的初始值,结束值和增量,还有一个模,求最少的循环次数. 分析: 读完题后应该就知道是一个同余的概念,所以就是解一个一元一次同余方程,像上题一样用扩展欧几里得算法.这题的trick点是k最大为32,那么2^32超出了int,要用long long,所以在1<<k时要这样做:1LL<<k,不然就WA了. 代码: #include<iostream> #include<cstdio> #include<algorithm> #inc

数论初步——扩展欧几里得算法

具体内容见紫书p313-p314 一.扩展欧几里得算法 思想:找出一对整数(x,y),使得ax+by=gcd(a,b) 举例:当"a=6,b=15"时,gcd(6,15)=3,故可以得到解"x=3,y=-1",当然还有其他解"x=-2,y=1". 程序: /* 扩展欧几里得算法 */ void gcd(int a, int b, int& d, int& x, int& y) { if(b == 0){ //边界,因为 a

扩展欧几里得算法求解不定方程【例 poj 1061】

扩展欧几里得算法是数论当中一种常用的算法,他可以用如下的姿势来表达: 设a, b为不全为0的整数,则存在整数x和y,使得 gcd(a, b) = a*x + b*y. 证明就略去. 树上还有一个拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需要的除法次数不会超过两个整数中较小的那个十进制数的倍数的5倍. 拉梅定理的一个推论:求两个正整数a, b, a > b的最大公因子需要O(log2a)3次的位运算. 至于拉梅定理有什么用,暂时还没有研究=—=. 例1 求225和21的最大公因子s,

欧几里得与扩展欧几里得算法

欧几里得算法:最大公因数\((gcd)\) 该算法基于: \(gcd(a,b)=gcd(b,a\)%\(b)\) 证明: 令\(a\) % \(b = r\), 则 \(a = k * b + r,\) 因此\(r = a - k * b\) 设\(d\)为\(a,b\)的公约数,那么\(d|a, d|b,\) 则\(a - k * b\) 能被\(d\)整除,即\(d|r\),即\(d|(a\) % \(b)\), 因此\(d\)是\(b\) 和 \((a\) %\(b)\)的公约数, 因此\

POJ 1061 青蛙的约会(扩展欧几里得算法)

http://poj.org/problem?id=1061 思路: 搞懂这个扩展欧几里得算法花了不少时间,数论真的是难啊. 含义:找出一对整数,使得ax+by=gcd(a,b). 接下来看这道题目,(x+mt)-(y+nt)=kl,转换成(n-m)t+kl=x-y. 令a=n-m,b=l,c=x-y,那么上式就变成了at+kb=c,之后就参照上面的算法来计算就行,具体参见代码. 1 #include<iostream> 2 #include<algorithm> 3 #inclu

浅谈扩展欧几里得算法(exgcd)

在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当\(a\%b==0\)的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by=gcd(a,b)\)的最小正整数解.根据数论的相关知识,一定存在一组解\(x,y\)使得\(ax+by=gcd(a,b)\).那就来谈谈具体如何来求解吧. 根据辗转相除法的内容\(gcd(a,b)=gcd(b,a\%b)\)我们可以得到:\[ax_1+by_1=gcd(a,b)=gcd(

扩展欧几里得算法的模板实现

我居然现在还记不住扩欧的板子,我太弱啦! 扩展欧几里得算法解决的是这样的问题: 给定一个不定方程组ax+by=gcd(a,b),求他的一组整数解 先给出实现代码 void exgcd(int a,int b,int &x,int &y) { if(!b) { x=1,y=0;//gcd(a,0)显然等于1*a-0*0=a return a; } int ans=exgcd(b,a%b,x,y); int tem=x; x=y; y-=tem-(a/b)*y; return ans;} 但实