数论
文章平均质量分 65
丶阿明
Hello World!
展开
-
HDU 2138 How many prime numbers
分析:题目就是让你求给定的n个数中有多少个是素数,用一般的方法要么超时要么超内存,可以用 miller_rabin 算术来快速的判断一个数是不是素数。# include # include __int64 ModMul(__int64 a,__int64 b,__int64 n) { __int64 ans=0; while(b) {原创 2015-07-25 20:51:21 · 381 阅读 · 0 评论 -
高精度除以单精度 和 高精度对单精度取模
int mod(string a,int b)//高精度 a%b{ int ans=0; for(char &c : a) ans=(10*ans+c-'0')%b; return ans;}string div(string a,int b)//高精度 a/b{ int i,r=0; string ans(""); if(a原创 2017-04-16 23:31:17 · 1794 阅读 · 0 评论 -
排列组合 C(n,m)
一、求解C(n,m)公式一: 公式二:公式二可以这么理解,从n个物品中取m个有2种情况:(1)不取第n个物品,于是从前n-1个中取m个; (2)取第n个物品,于是从前n-1个中取m-1; 所以答案是这两种情况的和 二、求解C(n,m)%p,p为质数当n,m,p都很大的时候,用公式二肯定不行了,费时间又费内存,这时候要用公式一,问题是取模时怎样可以把除法转化为乘法原创 2017-03-19 11:36:32 · 50440 阅读 · 1 评论 -
HDU 4349 Xiao Ming's Hope
题意:给你一个数 n ,求C(n, 0) 到 C(n, n)中有多少个奇数分析:判断C(n, i)是不是奇数,相当于求 C(n, i) %2,根据Lucas定理,求C(n ,i) % 2 先将 n 和 i 转化为2进制,分别为(a[k], a[k-1],...,a[1], a[0])2 和 (b[k], b[k-1],...,b[1], b[0])2,所以C(n, i)%2 = C(a[k],原创 2017-03-19 18:38:05 · 533 阅读 · 0 评论 -
CF 785D Anton and School - 2
题意:给你一串字符串(只包含字符'('和')'),求有多少个子串满足:长度是偶数,且左半边只有'(' 右半边只有')',比如"((()))"是一个满足条件的字符串分析:先记录每个字符左边有多少个'(',右边有多少个')',包含当前字符本身;然后从左往右遍历字符串,如果当前字符是'(',左边(包含本身)有a个'(',右边有b个')',那么满足条件的子字符串就增加了由最后一个等号左边到等号原创 2017-03-19 15:13:08 · 2391 阅读 · 1 评论 -
Miller-Rabin素数检测算法
今天看了一下Miller-Rabin素数检测的算法,总结了一下,希望这篇博客对你们有帮助。先说几个理论基础:1. 费马小定理:假如p是质数,a是整数,且a、p互质,那么a的(p-1)次方除以p的余数恒等于1,即:a^(p-1)≡1(mod p).但是反过来却不一定成立,就是说,如果a、p互质,且a^(p-1)≡1(mod p),不能推出p是质数,比如Carmichael数。2.原创 2016-07-09 16:22:23 · 7404 阅读 · 2 评论 -
简单快速的算法
1.最大公约数与最小公倍数 int Gcd(int a,int b)//快速求a,b的最大公约数 { int r; while(b) { r=a%b; a=b; b=r; } return a; } int lcm(int a,int b)//快速求a,b的最小原创 2015-07-17 20:58:05 · 1480 阅读 · 0 评论 -
POJ 1166 The Clocks
分析:已知9种操作,每种操作都会影响几个时钟,现给你9个时钟的初始状态,让你求出最少的操作方案使这9个时钟都调整为12点。根据已知的9种操作写出一个二维矩阵a[9][9],第j列表示第(j+1)种操作,第i行表示影响第(i+1)个时钟,如果第j种操作对第i个时钟有影响,a[j-1][i-1]=1,否则为0。设最小的调整方案为第1个时钟到第9个时钟分别调整ans[0]到ans[8]次,那么(9*9)原创 2015-07-16 20:29:54 · 547 阅读 · 0 评论 -
POJ 3090 Visible Lattice Points
分析:问你从原点(0,0)向区间0# include int Euler(int n) { int i,ans=1; for(i=2;i*i<=n;i++) { if(n%i==0) { n/=i; ans*=i-1; }原创 2015-07-25 20:47:15 · 465 阅读 · 0 评论 -
中国剩余定理 思路
原创 2018-04-26 13:20:24 · 427 阅读 · 0 评论