数论
BRCOCOLI
初学者 记录成长 Fighting
展开
-
唯一分解定理
唯一分解定律:又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。当题目有大数相除,求余数时,精度要求高时....就要运用唯一分解定律以下唯一分解定律证明:转自:http://www.matrix67.com/blog/archives/495为了真正地证明,分解质因数的方法是唯一的,我们将再次用到反证法。假设存在原创 2016-08-15 15:41:44 · 1497 阅读 · 0 评论 -
快速幂算法
原理:a^b可以分为以下几种情况若b是偶数,a^b=a^(b/2) * a^(b/2)若b是奇数,a^b=a^(b/2) * a^(b/2) * a;这样就可以用递归了代码如下int pow_mod(int a,int n,int m) //a^n 结果对m取模 { if(n==0) return 1; int x= pow_mod(a,n/2,m); long l原创 2016-08-04 17:36:07 · 315 阅读 · 0 评论 -
等比数列二分求和取模
Sn= a+a2+...+an要求 Sn mod p如果用公式算,可能溢出,因此用二分法求1) 若 n是偶数Sn= a+...+ a^(n/2) + a^(n/2+1) + a^(n/2+2) +...+ a^(n/2+n/2)=(a+...+ a^(n/2)) + a^(n/2)*(a+...+ a^(n/2))=Sn/2+ a^(n/2)Sn/2=(1+ a原创 2016-08-05 10:08:58 · 936 阅读 · 0 评论 -
欧几里得算法及其应用
1)求最大公约数int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%d); } 2)求最小公倍数int lcm(int a,int b){ return a*b/gcd(a,b);}3)扩展欧几里得算法求 ax+by=c的方程的解:先求出ax+by=gcd(a,b) 的一个解(x,y) ,为求出这个解原创 2016-08-07 12:29:11 · 609 阅读 · 0 评论 -
线性筛法求素数
#include#include#include#includeusing namespace std;bool isPrime[100000+5];int main(){ int n; cin>>n; memset(isPrime,true,sizeof(isPrime)); for(int i=2;i<=(int)sqrt(n);i++) if(isPrime[i])原创 2016-08-12 11:57:07 · 219 阅读 · 0 评论 -
矩阵的相关算法总结
题目地址:http://poj.org/problem?id=3233以下摘自百度百科矩阵加法:矩阵+常数:由于矩阵是一堆数,常数就一个,所以要把常数变为单位矩阵再相加单位矩阵用E表示:除了第i行第i列是1外,其他都是0所以矩阵+2,+1,就是+1E,+2E (2E就是E*2,即除了第i行第i列是2外,其他都是0)常数变完后就是正常的两个矩阵相加了,然后按上述原创 2016-08-05 23:45:49 · 3769 阅读 · 0 评论 -
中国剩余定理一般情况
给定正整数n1,n2,...,nk(未必两两互质),要求找到x,满足x≡ai(mod ni) (i=1,2...k)x ≡ a1( mod n1)x ≡ a2( mod n2) ...........即n1,....nk之间不一定互质那便是解k个线性方程,如下x + u*n1 = a1 x - v*n2 = a2.............原创 2016-08-12 16:31:08 · 876 阅读 · 0 评论 -
逆元
详细博客:逆元详解ax ≡ 1 mod m其中x就是a的逆元 x=a^-1原式子也即是:a*a^-1 ≡ 1 mod m求法:1)根据扩展欧几里得算法算法求的2)若a和m互素,根据费马小定理 a^(m-1)=1 mod m所以 a^-1也即是a的逆元=a^(m-2)%m有时候遇到一些题目:(a / b) % p != (a % p / b原创 2016-09-16 11:48:55 · 263 阅读 · 0 评论 -
Polya定理模板
暴力版#include#include#includeusing namespace std;typedef long long LL;int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}int euler_phi(int n){ int res=1; for(int i=2;i*i<=n;i++)原创 2016-08-14 16:40:34 · 838 阅读 · 0 评论