欧拉函数[caioj1158]

版权声明:作为一个蒟蒻,转载时请通知我这个蒟蒻 https://blog.csdn.net/zyszlb2003/article/details/89349052

1 1 ~ N N 中与 N N 互质的数的个数被成为欧拉函数,记为 φ ( N ) \varphi(N)
在算数基本定理中, N = p 1 c 1 p 2 c 2 . . . p m c m ( p i ) N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}(\forall p_i皆为质数) 则:
φ ( N ) = N ( p 1 1 p 1 ) ( p 2 1 p 2 ) . . . . . . ( p m 1 p m ) = N p N ( 1 1 p ) \varphi(N)=N*(\frac{p_1-1}{p1})*(\frac{p_2-1}{p2})*......*(\frac{p_m-1}{pm})=N*\prod_{质数 p|N}(1-\frac{1}{p})
证明:设 p , q p,q N N 的质因子,则 1 1 ~ N N 中p,q的倍数为 p , 2 p , 3 p , . . . . . . . , N / p , q , 2 q , 3 q , . . . . . . , N / q ( p q 2 ) p,2p,3p,.......,N/p,q,2q,3q,......,N/q(pq的倍数被筛了2遍)
共有 N / p + N / q N / p q N/p+N/q-N/pq 个(由算数基本定理可知, p q pq 一定 N ≤N ),则 1 1 ~ N N 中不与 N N 含有共同质因子 p p q q 的数的个数为:
N ( N p ) ( N q ) + ( N p q ) = N ( 1 1 p 1 q + 1 p q ) = N ( 1 1 p ) ( 1 1 q ) N-(\frac{N}{p})-(\frac{N}{q})+(\frac{N}{pq})=N*(1-\frac{1}{p}-\frac{1}{q}+\frac{1}{pq})=N(1-\frac{1}{p})(1-\frac{1}{q})
推广到多种情况(全部质因子),用数学归纳法证明即可。
证毕。
欧拉函数性质

  1. n > 1 , 1 \forall n>1,1 ~ n n 中与n互质的数的和为 n / 2 φ ( n ) n/2*\varphi(n)
    证明: n x g c d ( n , x ) = g c d ( n , n x ) n x n x n / 2. n n / 2 \because 与n互质的x,gcd(n,x)=gcd(n,n-x),\therefore 与n互质的x,n-x成对出现,平均值为n/2.因此与n互质的数的平均值也为n/2,证毕。

  2. 若a,b互质,则 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b)
    证明: φ ( a ) = a p a ( 1 1 p ) , φ ( b ) = b p b ( 1 1 p ) , φ ( a b ) = a b p a b ( 1 1 p ) = a b p a ( 1 1 p ) p b ( 1 1 p ) , \because \varphi(a)=a*\prod_{质数p|a}(1-\frac{1}{p}),\varphi(b)=b*\prod_{质数p|b}(1-\frac{1}{p}),\varphi(ab)=ab*\prod_{质数p|ab}(1-\frac{1}{p})=ab*\prod_{质数p|a}(1-\frac{1}{p})*\prod_{质数 p|b}(1-\frac{1}{p}),由于两数互质,无公共质因子。证毕。
    依照性质2,可得积性函数

  3. f f 是积性函数,且在算术基本定理中 n = i = 1 m p i c i n=\prod_{i=1}^{m}p_i^{c{i}} ,根据积性函数定义式可得。

  4. p n p\mid n p 2 n p^2\mid n ,则 φ ( n ) = φ ( n / p ) p \varphi(n)=\varphi(n/p)*p
    证明: φ ( n ) = n w n ( 1 1 w ) = ( n / p ) w n / p ( 1 1 w ) p = φ ( n / p ) p \varphi(n)=n*\prod_{质数w\mid n}(1-\frac{1}{w})=(n/p)*\prod_{质数 w\mid n/p}(1-\frac{1}{w})*p=\varphi(n/p)*p ,由于 n / p n/p n n 所含质因子相同,只是 p p 的指数不同罢了,所以等式成立。

  5. p , p n p是质数,p\mid n p 2 n p^2\nmid n ,则 φ ( n ) = φ ( n / p ) ( p 1 ) \varphi(n)=\varphi(n/p)*(p-1)
    证明: n / p p φ ( n ) = φ ( n / p ) φ ( p ) = φ ( n / p ) ( p 1 ) \because n/p与p互质,则\varphi(n)=\varphi(n/p)*\varphi(p)=\varphi(n/p)*(p-1)

  6. d n φ ( d ) = n \sum_{d \mid n}\varphi(d)=n
    证明: f ( n ) = d n φ ( d ) , f ( m ) = d m φ ( d ) 设f(n)=\sum_{d \mid n}\varphi(d),f(m)=\sum_{d \mid m}\varphi(d) , n , m φ 若n,m互质,\varphi是积性函数 f ( n m ) = d n m φ ( d ) = d n φ ( d ) d m φ ( d ) = f ( n ) f ( m ) f(nm)=\sum_{d \mid nm}\varphi(d)=\sum_{d \mid n}\varphi(d)*\sum_{d \mid m}\varphi(d)=f(n)*f(m) , d n φ ( d ) f ( p m ) = φ ( 1 ) + φ ( p ) + φ ( p 2 ) + . . . . . . + φ ( p m ) 即\sum_{d \mid n}\varphi(d)是积性函数,对于单个质因子,f(p^{m})=\varphi(1)+\varphi(p)+\varphi(p^2)+......+\varphi(p^m) 根据性质4,我们可以发现 f ( p m ) f(p^m) 等比数列求和+1,即 f ( p m ) = 1 + ( p 1 ( p 1 ) p m 1 p ) = p m . f(p^m)=1+(\frac{p-1-(p-1)*{p^m}}{1-p})=p^m. 所以 f ( n ) = i = 1 m f ( p i c i ) = i = 1 m p i c i = n f(n)=\prod_{i=1}^{m}f(p_i^{c_i})=\prod_{i=1}^{m}p_i^{c_i}=n 性质6成立.

题目描述

φ ( x ) \varphi(x) 表示小于或等于x的正整数中与n互质的数的数目。。
有n次询问,每次问 φ ( x ) \varphi(x) 的值。
【输入格式】
第一行 n n ( 1 < = n < = 10000 1<=n<=10000 )
下来n行,每行一个整数x,表示求 φ ( x ) \varphi(x) 。( 1 < = x < = 20000000 1<=x<=2000 0000 )
【输出格式】
每次询问输出一行一个整数 φ ( x ) \varphi(x)
【样例输入】
3
10
20
100
【样例输出】
4
8
40

代码

1.运用性质4、5

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int N=1270608;
const int M=2e7+10;
const int inf=2e7;
int prime[N],phi[M],m;
bool v[M];
void g_p()
{
    m=0;
    memset(v,true,sizeof(v));
    for(int i=2;i<=inf;i++)
    {
        if(v[i])prime[++m]=i,phi[i]=i-1;
        for(int j=1;j<=m&&i*prime[j]<=inf;j++)
        {
            v[i*prime[j]]=false;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=prime[j]*phi[i];
                break;
            }
            else
            {
                phi[i*prime[j]]=(prime[j]-1)*phi[i];
            }
        }
    }
}
int main()
{
    g_p();int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x;scanf("%d",&x);
        printf("%d\n",phi[x]);
    }
    return 0;
}

2.运用欧拉函数定理

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int N=2e7+10;
int a[N];
inline int solve(int x)
{
	int d=x,dd=x;
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0)
		{
			d=d/i*(i-1);
			while(!(x%i))
			{
				x/=i;
			}
		}
	}
	int last=0;
	if(x>1)d=d/x*(x-1);a[dd]=d;
	return d;
}
int main()
{
	int n;scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;scanf("%d",&x);
		printf("%d\n",!a[x-1]?solve(x-1):a[x-1]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zyszlb2003/article/details/89349052