
数论
BRCOCOLI
初学者 记录成长 Fighting
展开
-
唯一分解定理
唯一分解定律:又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。 当题目有大数相除,求余数时,精度要求高时....就要运用唯一分解定律 以下唯一分解定律证明: 转自:http://www.matrix67.com/blog/archives/495 为了真正地证明,分解质因数的方法是唯一的,我们将再次用到反证法。假设存在原创 2016-08-15 15:41:44 · 1539 阅读 · 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 · 338 阅读 · 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 · 970 阅读 · 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 · 642 阅读 · 0 评论 -
线性筛法求素数
#include #include #include #include using 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 · 233 阅读 · 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 · 4110 阅读 · 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 · 903 阅读 · 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 · 287 阅读 · 0 评论 -
Polya定理模板
暴力版 #include #include #include using 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 · 857 阅读 · 0 评论