数论专题hdu2669

  

  本题题意:关于式子aX + bY = 1 ,给出a、b,求X,Y(X为最小非负整数)。

  代码如下:

  

#include <iostream>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y,ll &d){
        if(!b){
                x = 1;
                y = 0;
                d = a;
        }else{
                exgcd(b,a%b,y,x,d);
                y -= a/b*x;
        }
}

int main(){
        ll a,b;
        while(cin >> a >> b){
                ll x,y,d;
                exgcd(a,b,x,y,d);
                if(d == 1){
                        cout << (x%b+b)%b << " " << (y%a-a)%a << endl;
                }else{
                        cout << "sorry" << endl;
                }
        }
        return 0;
}

这道题的题意是解一个同余模方程,aX + bY = 1代入exgcd(),可以得到结果x,y但是x可能是负数,因此最后要(x%b+b)%b,y同样也要处理(y%a + y)%y,d不等于1时,无解。

时间: 2024-11-05 16:23:45

数论专题hdu2669的相关文章

数论专题总结

数论专题总结 kuangbin带你飞之数论基础专题已经刷的差不多了,剩下三道一道中国剩余定理一道离散对数还有一道模拟,模拟那道应该是不会去做了,离散对数的那道看了很多题解一直没有理解题目的思路,只能先暂时放放了,中国剩余定理那道是刘汝佳大白书的例题,暂时没思路也只能先放放了,以后有机会再看下大白书,中国剩余定理已经了解了,离散对数的BSBS模版也有了,虽然这两道变形题暂时不会,但是数论专题部分基础已经有一些了,刷该专题的目标已经完成了,下一专题:kmp. 待补充......

ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德

POJ 1061 青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰

数论专题(转)

经过长时间的试验,发现果然学编程还是要学好数学先,数学引发的更加有质的变化,而盲目学各种编程语言也不能获得一种不一样的体验,或者我没掌握到诀窍.另外打算从这学期学的 信安数学基础 学到的庞大的数论体系开刀,上了这课明显体会到彻底自学就是扯蛋. 网上找到这份题目,还不错的赶脚,刷起! 2014-11-11开始刷起,有链接表示KO 博弈论POJ 2234 Matches GamePOJ 2975 NimPOJ 2505 A multiplication gamePOJ 1067 取石子游戏POJ 2

数论专题hdu2197

本题题意:求长度为n的本元串的个数,本元串就是无法由几个相同的子串拼接的01串. 代码如下: #include <iostream> using namespace std; typedef long long ll; const int mod = 2008; ll pow_(ll a,ll b,ll mod){ ll sum = 1; while(b){ if(b&1){ sum = sum * a % mod; } a = a * a % mod; b >>= 1;

数论专题hdu2582

本题题意:给出公式f(n) = gcd(3) + ... + gcd(n),而gcd(n) = gcd(C(1,n),...,C(n-1,n)),求出f(n)的值. 代码如下: #include <iostream> using namespace std; typedef long long ll; const int Max = 1000000; int prime[Max+1]; ll sum[Max+1]; void Prime(){ int t = 2; ll i; while(t

数论专题测试——幸运数字

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 typedef long long int64; 8 int64 L; 9 int ca; 10 int64 phi(int64 x){ 11 int64 t=x; 12 for (int6

数论专题hdu2104

本题题意:有N个人,一个人从1开始走,每次间隔M-1个人,问他是否能走到所有的点,并回到原点. 代码如下: #include <cstdio> using namespace std; int gcd(int a,int b) { int r; while(b) { r = a % b; a = b; b = r; } return a; } int main(){ int m,n; while(~scanf("%d%d",&m,&n) &&

数论专题测试——逆元

题意:给定n,m,令k=1+sigam(inv(i,n))mod 1000000007.   n,m小于等于10^7. 求k^k^k^k....后一个k是前一个k的指数,  求这个值对m的mod,知道指数循环节,这就是个傻逼题,然而考场就是不知道这个,少了点东西,所以出题人就是个傻逼.... 指数循环节:a^b%c=>a^(b%phi(c)+phi(c))   %c (b>=phi(c)). 这个题b永远无限大,就可以使用,可以考虑预处理出10^7范围内的phi,然后递归,当c==1时,返回0

ACM:数论专题(3)——约瑟夫问题

(p.s: 以前做约瑟夫问题都是用链表模拟,今天发现了一个效率更高的方法,受教了...) 题目描述: 小Hi和小Ho的班级正在进行班长的选举,他们决定通过一种特殊的方式来选择班长. 首先N个候选人围成一个圈,依次编号为0..N-1.然后随机抽选一个数K,并0号候选人开始按从1到K的顺序依次报数,N-1号候选人报数之后,又再次从0开始.当有人报到K时,这个人被淘汰,从圈里出去.下一个人从1开始重新报数. 也就是说每报K个数字,都会淘汰一人.这样经过N-1轮报数之后,圈内就只剩下1个人了,这个人就作