码迷,mamicode.com
首页 > 其他好文 > 详细

【史前巨坑】数论模板整合

时间:2015-02-12 21:29:22      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:数论

跪了一下午数论

整理了一下数论模板

这是个史前巨坑,有空慢慢填

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 1000000
using namespace std;
bool not_prime[MAXN];
int prime_number[MAXN];
int nu;
int factor[MAXN];//顺手记录一下最小质因子 
void prime()//线筛 
{
	for (int i=2;i<=MAXN;i++)
	{
		if (!not_prime[i])
		{
			prime_number[++nu]=i;
			factor[i]=i;
		}
		for (int j=1;j<=nu&&i*prime_number[j]<=MAXN;j++)
		{
			not_prime[i*prime_number[j]]=1;
			f[i*prime_number[j]]=prime_number[j];
			if (i%prime_number[j]==0) break;
		}
	}
}
int mu[MAXN]={0,1};
void mu()//莫比乌斯函数
{
	for (int i=2;i<=MAXN;i++)
	{
		if (!not_prime[i])
		    mu[i]=-1;
		for (int j=1;j<=nu&&i*prime_number[j]<=MAXN;j++)
		{
			not_prime[i*prime_number[j]]=1;
			if (i%prime_number[j]==0)
			{
				mu[i*prime_number[j]]=0;
				break;
			}
			else
			{
				mu[i*prime_number[j]]=-mu[i];
			}
		}
	}
}  
int phi[MAXN];
void phi()//欧拉函数 
{
	for (int i=2;i<=MAXN;i++)
	{
		if (!not_prime[i])
		{
			phi[i]=i-1;
		}
		for (int j=1;j<=nu&&i*prime_number[j]<=MAXN;j++)
		{
			not_prime[i*prime_number[j]]=1;
			if (i%prime_number[j]==0)
			{
				phi[i*prime_number[j]]=phi[i]*prime_number[j];
				break;
			}
			else
			{
				phi[i*prime_number[j]]=phi[i]*(prime_number[j]-1);
			}
		}
	}
}
int inv[MAXN];
//以下连续逆元 
void inv1()//费马小定理 
{
	for (int i=1;i<=MAXN;i++)
	    inv[i]=pow(i,phi[p]-1)%p;//p根据题目要求不同来定 
}
void inv2()//基于线筛的求法 
{
	for (int i=2;i<=MAXN;i++)
	{
		int a=p/i;
		int b=p%i;
		inv[i]=(p-a)*inv[b]%p;
	}
}
void inv3()//基于阶乘的求法
{
	unsigned long long a[MAXN]={1},rev[MAXN];//这个阶乘略大0-0不想写高精度了unsigned凑活看着吧
	for (int i=1;i<=MAXN;i++)
	    a[i]=a[i-1]*i;
	rev[MAXN]=pow(a[MAXN],phi[p]-1)%p;
	for (int i=MAXN-1;i>=0;i--)
	    rev[i]=rev[i+1]*(i+1)%p;
	for (int i=1;i<=MAXN;i++)
	    inv[i]=a[i-1]*rev[i];
} 
void inv4()//基于a*i+b=p的求法,此做法仅用于p为素数 
{
	inv[1]=1;
	for (int i=2;i<=MAXN;i++)
	{
		int a=p/i;
		int b=p%i;
		inv[i]=(p-a)*inv[b]%p;
	}
}
//中国剩余定理,原根,离散对数,Lucas定理做组合数,mobius反演未完待续=。=
//感谢LYP神犇的授课。逆元里后三种求法还有莫比乌斯函数都是他讲的。。。 
/*int main()
{
	
}*/


【史前巨坑】数论模板整合

标签:数论

原文地址:http://blog.csdn.net/creationaugust/article/details/43770127

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!