数论整理

一、欧拉函数

1、欧拉函数被定义为小于或等于n的数中与n互质的个数。它的一般计算式是:Phi(n)=n*(1-1/p_{1})*(1-1/p_{2})*...**(1-1/p_{k}),其中p1...pk为n的所有质因子。

2、有关欧拉函数的几点性质如下:

      phi(1) = 1

     若n是质数,那么phi(n) = n-1

     若n是质数x的k次幂,phi(n) = (x-1)*x^(k-1)

     若m,n互质,那么phi(m*n) = phi(m)*phi(n)

     若n是奇数,那么phi(2*n) = phi(n)

     若x,y是质数,且n = x*y,那么phi(n) = (x-1)*(y-1)

     小于n且与n互质的数的和为:n/2 * phi(n)

3、求解某个欧拉函数值,代码如下:

int oula(int n)
{
	int res = n, a = n;
	for(int i = 2; i*i <= a; ++i){
		if(a%i == 0){
			res = res/i*(i-1);
			while(a%i == 0) a = a/i;
		}
	}
	if(a > 1) res = res/a*(a-1);
	return res;
}

4、求解1~n中所有数的欧拉函数值,并保存在了phi数组中,代码如下:

const int MAXN = 3e6+5;
__int64 phi[MAXN];
 
void PhiTable(int n)
{
    for(int i=2; i<=n; ++i)
        phi[i] = 0;
    phi[1] = 1;
    for(int i=2; i<=n; ++i) if((!phi[i]))
        for(int j=i; j<=n; j+=i)
        {
            if(!phi[j]) phi[j] = j;
            phi[j] = phi[j]/i * (i-1);
        }
}

5、求出了1~n中所有数的欧拉函数值的前缀和,并保存在了f数组中,代码如下:

const int MAXN = 3e6+5;
__int64 f[MAXN];
void SumPhiTable(int n)
{
    f[1] = 1;
    for(int i=2; i<n; ++i)
    {
        if(!f[i])
        {
            for(int j=i; j<n; j+=i)
            {
                if(!f[j]) f[j] = j;
                f[j] = f[j]/i * (i-1);
            }
        }
        f[i] += f[i-1];
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值