数论模版

//求gcd(a, b)
LL gcd(LL a, LL b)
{
	return b ? gcd(b, a%b) : a;
}
//求整数x和y,使得ax+by=d, 且|x|+|y|最小。其中d=gcd(a,b)
void gcd(LL a, LL b, LL& d, LL& x, LL& y)
{
	if(!b)
	{
		d = a;
		x = 1;
		y = 0;
	}
	else
	{
		gcd(b, a%b, d, y, x);
		y -= x * (a/b);
	}
}
//计算模n下a的逆。如果不存在逆, 返回-1
LL inv(LL a, LL n)
{
	LL d, x, y;
	gcd(a, n, d, x, y);
	return d == 1 ? (x+n)%n : -1;
}

数论模版,布布扣,bubuko.com

时间: 2024-12-25 22:14:08

数论模版的相关文章

[原博客] BZOJ 2242 [SDOI2011] 计算器

题目链接 noip级数论模版题了吧.让求三个东西: 给定y,z,p,计算Y^Z Mod P 的值. 给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数. 给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数. 其中P均为素数.来分着处理. 1 y^z%p 快速幂.推荐一种又快又好写的写法. 1 LL power_mod(LL a,LL b,LL p){ //get a^b%p 2 LL ret=1; 3 while(b){ 4 if(b&1) ret = re

数论 (大数,小费马定理,欧拉定理,威尔逊定理,快速数论变换(NNT)模版)

1 Java大数 2 import java.util.*; 3 import java.math.*; 4 public class Main{ 5 public static void main(String args[]){ 6 Scanner cin = new Scanner(System.in); 7 BigInteger a, b; 8 9 //以文件EOF结束 10 while (cin.hasNext()){ 11 a = cin.nextBigInteger(); 12 b

【poj 1006】Biorhythms(数论--中国剩余定理 模版题){附【转】中国剩余定理 }

题意: 有 解法:中国剩余定理.定义为有 k 对关系:P % ai = bi,其中 ai 两两之间互质.(而两两之间不互质就是把原来的关系式化为:P = bi (mod ai) →  ai * x + bi = P,用拓展欧几里德求解同余方程组了.)    而 ai 两两互质时,可知道 a2*a3*...*ak = 1 (mod a1)  和  a1*a3*...*ak = 1 (mod a2) 等关系.那么想使 P % ai = bi ,就是要式子两边同乘 bi 了. 下面是转载的了~ 原博:

【hdu 1573】X问题(数论--拓展欧几里德 求解同余方程组的个数 模版题)

题目:求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <= 10). 解法:先同上题一样用拓展欧几里德求出同余方程组的最后一个方程 X=ax+b,再调整 x 来求得 X 的解的个数.一些解释请看下面的代码. 注意——每次联立方程后求最小正整数解,可以提高代码速度. 1 #include<cstdio> 2 #i

数论专题总结

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

《算法导论》——数论

1 . 欧几里得算法(递归法球两个数的最大公约数) 算法比较简单就直接贴代码了: int gcd(int a , int b){     return b ==0 ? a : gcd(b , a%b); } 在这个算法的基础上可以该进,gcd(a*n , b*n)=n*gcd(a , b);这个定理给我们提供了思路:可不可以在算法中加如判断减少递归的次数呢?当然可以. int gac(int m,int n){  if(m==0 || n==0)   return (m==0) ? n : m;

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

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

ACM数论-欧几里得与拓展欧几里得

ACM数论--欧几里得与拓展欧几里得 欧几里得算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). int gcd(int a,int b) { return b ? gcd(b,a%b) : a; } 扩展欧几里德算法: 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使

NKOJ1236 a^b (数论定理的应用)

          a^b 对于任意两个正整数a,b(0<=a,b<10000)计算a b各位数字的和的各位数字的和的各位数字的和的各位数字的和. Input 输入有多组数据,每组只有一行,包含两个正整数a,b.最后一组a=0,b=0表示输入结束,不需要处理. Output 对于每组输入数据,输出ab各位数字的和的各位数字的和的各位数字的和的各位数字的和. Sample Input 2 3 5 7 0 0 Sample Output 8 5 思路: 数论定理:任何数除以9的余数等于各位数的和除