数论
文章平均质量分 54
DASEason
https://github.com/qq547276542
展开
-
Lucas大组合数模板
typedef long long ll;struct Lucas { ll n, m, p; ll qPow (ll a, ll k) { ll ans = 1; while (k) { if (k&1) ans = (ans * a) % p; a = (a * a) % p; k /= 2; } return ans; } ll C (ll a, ll b) { if (a a - b)原创 2015-08-20 10:32:11 · 1591 阅读 · 0 评论 -
求一个数最少能表示成几个数的平方和(比如5=1+4,返回2)
bool is_sqrt(long long n) { int m = sqrt(n); if (m*m == n) return true; else return false;}int solve(long long n) { if (is_sqrt(n)) return 1; while (n % 4原创 2017-03-12 19:14:10 · 5465 阅读 · 0 评论 -
pollard_rho质因素分解(需要用到Miller-Rabin素数测试)
代码如下://**********************************************// pollard_rho 算法进行质因素分解//////*********************************************long long factor[100];//质因素分解结果(刚返回时时无序的)int tol;//质因素的个数,编号0~to原创 2016-01-31 21:05:54 · 3632 阅读 · 0 评论 -
Miller-Rabin素数测试(被测数可以是小于2^63的正整数)
首先改算法原理是基于费马小定理: 假如p是素数,且gcd(a,p)=1,那么a^(p-1)%p=1推论: 若p是素数且a是正整数,那么a^p%p=a定义:令a是一正整数,若n是合数且满足a^n%n=a,则n称为以a为基的伪素数素数测试原理:取多个a为底,若n都是以a为基的伪素数,则可以近似认为n为素数。取多个底进行试验,次数越多,n为素数的概率就越大typedef原创 2016-01-31 20:37:53 · 2434 阅读 · 0 评论 -
扩展Baby Step Giant Step (解(a^x)%n=b,其中c没有限制)
#define N 1000000struct Node{ int idx; int val;}baby[N];bool cmp(Node n1,Node n2){ return n1.val!=n2.val?n1.val<n2.val:n1.idx<n2.idx;}int gcd(int a,int b){ return b==0?a:gcd(b,a%b原创 2016-01-26 11:00:18 · 2218 阅读 · 1 评论 -
Baby-Step Giant-Step 解高次同余方程(形如(a^x)%n=b,其中n为素数)
//baby_step giant_step// a^x = b (mod n) n为素数,a,b < n// 求解上式 0<=x < n的解#define MOD 76543int hs[MOD],head[MOD],next[MOD],id[MOD],top;void insert(int x,int y) { int k = x%MOD; hs[top] = x,原创 2016-01-26 00:42:44 · 896 阅读 · 0 评论 -
素数的分布(素数定理),求1~10^n 素数个数的位数
素数定理:素数有无穷多个,能估计出一个小于正实数x的素数有多少个,并用π(x)来表示,这就是素数定理定理内容: 随着x的增长,π(x)/(x/lnx)=1 具体数据见下表:n 1e3 1e4 1e5 1e6 1e7π(n) 168 1229 9892 78498原创 2016-01-26 00:03:08 · 8504 阅读 · 1 评论 -
大区间素数筛选(POJ 2689)
给出一个区间[L, R],找出区间内容、相邻的距离最近的两个素数和距离最远的两个素数。我们可以通过2次筛法,第一次先筛选出素数表,第二次通过素数表再筛选出[L,R]之间的素数注意因为L和R的值非常大,但是R-L是小于1e6的,所以我们可以开一个vis2数组,然后将存放区间是否为合数的vis[L,R]映射到vis2[0,R-L](也就是向左偏移L个单位)#include#inc原创 2015-11-03 11:38:21 · 1481 阅读 · 0 评论 -
高斯消元法解01异或方程组(附poj 1222题解)
const int maxn=50;//有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1int equ,var;int a[maxn][maxn]; //增广矩阵int x[maxn]; //解集int free_x[maxn];int free_num;void init(){ memset(a,0,sizeof(a)); memset(x,0原创 2015-11-12 23:16:35 · 6050 阅读 · 0 评论 -
扩展欧几里得算法,解模线性方程,解ax+by=c的解集
typedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y){ if(a==0&&b==0) return -1; if(b==0) { x=1;y=0; return a; } LL d=exgcd(b,a%b,y,x); y-=a/b*x; return d;}LL cal(LL a,LL b原创 2015-11-05 20:06:24 · 3295 阅读 · 0 评论 -
求1~n中与m互质的数的个数(m>n) 附hdu1695题解(欧拉函数+容斥原理)
int calc(int n,int m) { //求1~n 与m互质的数的个数 int num=getFactors(m); //先将m分解质因数 int sum=0; //先求出不互质的个数,最后用n减去该数 for(int state=1; state<(1<<num); state++) { //枚举状态 int tmp=1;原创 2015-11-08 21:32:07 · 5795 阅读 · 0 评论 -
素数筛选,整数的唯一分解,整数所有因子之和,递归求等比数列前n项和
typedef long long LL;const int maxn=10000;int prime[maxn+7]; //下标从1开始,prime[0]存的是素数个数int getPrime(){ //求小于maxn的所有素数,返回素数个数 memset(prime,0,sizeof(prime)); for(int i=2;i<=maxn;i++){原创 2015-11-05 11:47:36 · 783 阅读 · 0 评论 -
非互质中国剩余定理求线形模方程组(形如 X%mi=ai)
typedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y){ if(a==0&&b==0) return -1; if(b==0) { x=1;y=0; return a; } LL d=exgcd(b,a%b,y,x); y-=a/b*x; return d;}int m[10原创 2015-11-06 11:08:12 · 930 阅读 · 0 评论