Comet OJ - Contest #8 E.神奇函数(欧拉函数性质)

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

BB

其实是一道sb题
1013+10组数据足以把
杜教筛/min25/洲阁筛/反演+筛μ/分块+筛质数
给送上天了
所以正解肯定是T√n的做法

性质

欧拉函数有一个著名的性质:
n = ∑ d ∣ n φ ( d ) n=\sum_{d|n}{\varphi(d)} n=dnφ(d)
证明:
F ( n ) = ∑ d ∣ n φ ( d ) F(n)=\sum_{d|n}{\varphi(d)} F(n)=dnφ(d),则
F ( n ) ∗ F ( m ) = ∑ i ∣ n φ ( i ) ∗ ∑ j ∣ m φ ( j ) F(n)*F(m)=\sum_{i|n}{\varphi(i)}*\sum_{j|m}{\varphi(j)} F(n)F(m)=inφ(i)jmφ(j)(nm互质)
= ∑ i ∣ n ∑ j ∣ m φ ( i ∗ j ) =\sum_{i|n}{\sum_{j|m}{\varphi(i*j)}} =injmφ(ij)
= F ( n ∗ m ) =F(n*m) =F(nm)
所以证得F(n)是积性函数
F ( p k ) F(p^k) F(pk)(p为质数)
F ( p k ) = ∑ i = 0 k φ ( p i ) F(p^k)=\sum_{i=0}^{k}{\varphi(p^i)} F(pk)=i=0kφ(pi)
= ( ∑ i = 1 k p i ∗ ( 1 − 1 p ) ) + 1 =(\sum_{i=1}^{k}{p^i*(1-\frac{1}{p})})+1 =(i=1kpi(1p1))+1
= ( ∑ i = 1 k p i − 1 ∗ ( p − 1 ) ) + 1 =(\sum_{i=1}^{k}{p^{i-1}*(p-1)})+1 =(i=1kpi1(p1))+1
= ( ∑ i = 1 k p i − p i − 1 ) + 1 =(\sum_{i=1}^{k}{p^i-p^{i-1}})+1 =(i=1kpipi1)+1
= p k − p 0 + 1 =p^k-p^0+1 =pkp0+1
= p k =p^k =pk
由于F(n)是积性函数,且F(pk)=pk,所以可以推得F(n)=n(对于任意n)
所以
F ( n ) = ∑ d ∣ n φ ( d ) F(n)=\sum_{d|n}{\varphi(d)} F(n)=dnφ(d)
n = ∑ d ∣ n φ ( d ) n=\sum_{d|n}{\varphi(d)} n=dnφ(d)
参考:https://blog.csdn.net/liuzibujian/article/details/81086324

题解

题目的 f ( n ) = ∏ a i ⌊ p i 2 ⌋ f(n)=\prod{ {a_i}^{\left \lfloor \frac{p_i}{2} \right \rfloor}} f(n)=ai2pi
可以发现,每个质因子的质数除了2
那么
f ( n ) = ∑ d ∣ f ( n ) φ ( d ) f(n)=\sum_{d|f(n)}{\varphi(d)} f(n)=df(n)φ(d)
本质上,枚举d其实是枚举n中指数为1的倍数的约数
由于先前除了2,考虑把d和f(n)的指数都乘以2,这样得到的实际上是一样的
所以
f ( n ) = ∑ d 2 ∣ n φ ( d ) f(n)=\sum_{d^2|n}{\varphi(d)} f(n)=d2nφ(d)
a n s = ∑ i = 1 n f ( i ) = ∑ i = 1 n ∑ d 2 ∣ i φ ( d ) ans=\sum_{i=1}^{n}{f(i)}=\sum_{i=1}^{n}{\sum_{d^2|i}{\varphi(d)}} ans=i=1nf(i)=i=1nd2iφ(d)
= ∑ d = 1 ⌊ n ⌋ ∑ d 2 ∣ i    a n d    i ⩽ n φ ( d ) =\sum_{d=1}^{\left \lfloor \sqrt{n} \right \rfloor}{\sum_{d^2|i \; and \; i\leqslant n}{\varphi(d)}} =d=1n d2iandinφ(d)
= ∑ d = 1 ⌊ n ⌋ φ ( d ) ∗ ⌊ n d 2 ⌋ =\sum_{d=1}^{\left \lfloor \sqrt{n} \right \rfloor}{\varphi(d)*\left \lfloor \frac{n}{d^2} \right \rfloor} =d=1n φ(d)d2n
没了

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define Len 3162277
using namespace std;

bool f[Len+1];
int p[Len+1];
int phi[Len+1];
int T,N,i,j,k,l,len;
long long n,ans;

void init()
{
    
    
	int i,j;
	
	memset(f,0,sizeof(f));
	len=0;
	
	phi[1]=1;
	fo(i,2,Len)
	{
    
    
		if (!f[i])
		{
    
    
			p[++len]=i;
			phi[i]=i-1;
		}
		
		fo(j,1,len)
		if ((long long)i*p[j]<=Len)
		{
    
    
			f[i*p[j]]=1;
			phi[i*p[j]]=phi[i]*p[j];
			
			if (!(i%p[j]))
			break;
			
			phi[i*p[j]]=phi[i*p[j]]/p[j]*(p[j]-1);
		}
		else
		break;
	}
}

int main()
{
    
    
//	freopen("e.in","r",stdin);
	
	init();
	
	scanf("%d",&T);
	for (;T;--T)
	{
    
    
		scanf("%lld",&n);
		N=floor(sqrt(n));
		
		ans=0;
		fo(i,1,N)
		ans+=phi[i]*(n/i/i);
		
		printf("%lld\n",ans);
	}
}

猜你喜欢

转载自blog.csdn.net/gmh77/article/details/99066792
今日推荐