【题解】函数

Description \text{Description} Description

定义函数 f f f,该函数满足

∑ d ∣ n f ( d ) = n \sum\limits_{d\mid n}f(d)=n dnf(d)=n

给定 N N N 个正整数 A 1 , A 2 , … , A n A_1,A_2,\dots,A_n A1,A2,,An,请求出 ∑ i = 1 N f ( A i ) \sum_{i=1}^Nf(A_i) i=1Nf(Ai)

测试点编号 N N N A i A_i Ai
0 0 0 100 100 100 ≤ 100 \le100 100
1 1 1 100 100 100 ≤ 100 \le100 100
2 2 2 1000 1000 1000 ≤ 10000 \le10000 10000
3 3 3 3 × 1 0 7 3\times10^7 3×107 7 7 7
4 4 4 3000 3000 3000 ≤ 1 0 6 \le10^6 106
5 5 5 4000 4000 4000 ≤ 1 0 6 \le10^6 106
6 6 6 10000 10000 10000 ≤ 1 0 7 \le10^7 107
7 7 7 100000 100000 100000 ≤ 1 0 7 \le10^7 107
8 8 8 5 5 5 162614600673829 , 1125897758834689 , 222915410844073 , 18004502351257601 , 2001600073928249 162614600673829,1125897758834689,222915410844073,18004502351257601,2001600073928249 162614600673829,1125897758834689,222915410844073,18004502351257601,2001600073928249
9 9 9 3 3 3 18014398241046527 , 18014398777917439 , 489133282872437279 18014398241046527,18014398777917439,489133282872437279 18014398241046527,18014398777917439,489133282872437279

Solution \text{Solution} Solution

对于测试点 3 , 8 , 9 3,8,9 3,8,9,直接变成提交答案(

3 : a n s = 3 × 1 0 7 × ( 7 − 1 ) = 1.8 × 1 0 8 3:ans=3\times10^7\times(7-1)=1.8\times10^8 3:ans=3×107×(71)=1.8×108

8 : 8: 8: 所有数都是质数 × \times × 质数。

9 : 9: 9: 所有数都是质数。

对于剩下的有 3 3 3 种思路:

1. 1. 1.

n = ∑ d ∣ n f ( d ) = ∑ d ∣ n , d ≠ n f ( d ) + f ( n ) \begin{aligned}n&=\sum_{d\mid n}f(d)\\&=\sum_{d\mid n,d\ne n}f(d)+f(n)\end{aligned} n=dnf(d)=dn,d=nf(d)+f(n)

∴ f ( n ) = n − ∑ d ∣ n , d ≠ n f ( d ) \therefore f(n)=n-\sum\limits_{d\mid n,d\ne n}f(d) f(n)=ndn,d=nf(d)

这个可以用埃氏筛。

时间复杂度 O ( 值 域 值 域 ) \mathcal{O}(值域\sqrt{值域}) O( )

前置芝士:欧拉函数

1 ∼ n 1\sim n 1n 中与 n n n 互质的数的个数记为 φ ( n ) \varphi(n) φ(n),它被称为欧拉函数。

以下是一些要用到的性质:

  1. n n n 的质因数分解为 n = p 1 c 1 p 2 c 2 ⋯ p m c m n=p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m} n=p1c1p2c2pmcm,则 φ ( n ) = n × p 1 − 1 p 1 × p 2 − 1 p 2 × ⋯ × p m − 1 p m \varphi(n)=n\times\frac{p_1-1}{p_1}\times\frac{p_2-1}{p_2}\times\cdots\times\frac{p_m-1}{p_m} φ(n)=n×p1p11×p2p21××pmpm1 (欧拉公式)。

证明:

p 1 p_1 p1 个数中有 ( p 1 − 1 ) (p_1-1) (p11) 个与 n n n 互质,这其中每 p 2 p_2 p2 个数中有 ( p 2 − 1 ) (p_2-1) (p21) 个与 n n n 互质……

  1. gcd ⁡ ( n , m ) = 1 \gcd(n,m)=1 gcd(n,m)=1,则 φ ( n m ) = φ ( n ) φ ( m ) \varphi(nm)=\varphi(n)\varphi(m) φ(nm)=φ(n)φ(m) φ ( n ) \varphi(n) φ(n) 是积性函数,但不是完全积性函数)。

证明:

n n n n p \frac{n}{p} pn 的分解中都含 p p p,只是 p p p 的次数不同。 φ ( n ) = n × p − 1 p × A , φ ( n p ) = n p × p − 1 p × A \varphi(n)=n\times\frac{p-1}{p}\times A,\varphi(\frac{n}{p})=\frac{n}{p}\times\frac{p-1}{p}\times A φ(n)=n×pp1×A,φ(pn)=pn×pp1×A,那么 φ ( n ) ÷ φ ( n p ) = p \varphi(n)\div\varphi(\frac{n}{p})=p φ(n)÷φ(pn)=p

  1. p p p 为质数且 p ∣ n , p 2 ∣ n p\mid n,p^2\mid n pn,p2n,则 φ ( n ) = φ ( n p ) p \varphi(n)=\varphi(\frac{n}{p})p φ(n)=φ(pn)p

证明:

φ ( n ) = n × p − 1 p × A , φ ( n p ) = n p × A \varphi(n)=n\times\frac{p-1}{p}\times A,\varphi(\frac{n}{p})=\frac{n}{p}\times A φ(n)=n×pp1×A,φ(pn)=pn×A,那么 φ ( n ) ÷ φ ( n p ) = p − 1 \varphi(n)\div\varphi(\frac{n}{p})=p-1 φ(n)÷φ(pn)=p1

  1. p p p 为质数且 p ∣ n , p 2 ∤ n p\mid n,p^2\nmid n pn,p2n,则 φ ( n ) = φ ( n p ) ( p − 1 ) \varphi(n)=\varphi(\frac{n}{p})(p-1) φ(n)=φ(pn)(p1)

证明:

φ ( n ) = n × p − 1 p × A , φ ( n p ) = n p × A \varphi(n)=n\times\frac{p-1}{p}\times A,\varphi(\frac{n}{p})=\frac{n}{p}\times A φ(n)=n×pp1×A,φ(pn)=pn×A,那么 φ ( n ) ÷ φ ( n p ) = p − 1 \varphi(n)\div\varphi(\frac{n}{p})=p-1 φ(n)÷φ(pn)=p1

  1. ∑ d ∣ n φ ( d ) = n \sum\limits_{d\mid n}\varphi(d)=n dnφ(d)=n

证明:

g ( n ) = ∑ d ∣ n φ ( n ) g(n)=\sum\limits_{d\mid n}\varphi(n) g(n)=dnφ(n),因为 φ ( n ) \varphi(n) φ(n) 是积性函数,所以有 g ( n m ) = ∑ d ∣ n m φ ( d ) = ∑ d ∣ n φ ( d ) ∑ d ∣ m φ ( d ) = g ( n ) g ( m ) g(nm)=\sum\limits_{d\mid nm}\varphi(d)=\sum\limits_{d\mid n}\varphi(d)\sum\limits_{d\mid m}\varphi(d)=g(n)g(m) g(nm)=dnmφ(d)=dnφ(d)dmφ(d)=g(n)g(m),即 g ( n ) = ∑ d ∣ n φ ( n ) g(n)=\sum\limits_{d\mid n}\varphi(n) g(n)=dnφ(n) 是积性函数。

以单个质因数 p p p 为例,若次数是 k k k,则

g ( p m ) = 1 + φ ( p ) + φ ( p 2 ) + ⋯ + φ ( p k ) = 1 + φ ( p ) + φ ( p ) × p + ⋯ + φ ( p ) × p k − 1 = 1 + φ ( p ) × p k p − 1 = 1 + ( p − 1 ) p k − 1 p − 1 = p k \begin{aligned}g(p^m)&=1+\varphi(p)+\varphi(p^2)+\cdots+\varphi(p^k)\\&=1+\varphi(p)+\varphi(p)\times p+\cdots+\varphi(p)\times p^{k-1}\\&=1+\varphi(p)\times \frac{p^{k}}{p-1}=1+(p-1)\frac{p^k-1}{p-1}\\&=p^k\end{aligned} g(pm)=1+φ(p)+φ(p2)++φ(pk)=1+φ(p)+φ(p)×p++φ(p)×pk1=1+φ(p)×p1pk=1+(p1)p1pk1=pk

n = 2 3 × 3 2 n=2^3\times3^2 n=23×32 为例,

g ( n ) = φ ( 1 ) + φ ( 2 ) + φ ( 2 2 ) + φ ( 2 3 ) + φ ( 3 ) + φ ( 3 2 ) + φ ( 2 × 3 ) + φ ( 2 2 × 3 ) + φ ( 2 3 × 3 ) + φ ( 2 × 3 2 ) + φ ( 2 2 × 3 2 ) + φ ( 2 3 × 3 2 ) = 1 + φ ( 2 ) + φ ( 2 2 ) + φ ( 2 3 ) + φ ( 3 ) + φ ( 3 2 ) + φ ( 2 ) × φ ( 3 ) + φ ( 2 2 ) × φ ( 3 ) + φ ( 2 3 ) × φ ( 3 ) + φ ( 2 ) × φ ( 3 2 ) + φ ( 2 2 ) × φ ( 3 2 ) + φ ( 2 3 ) × φ ( 3 2 ) = 1 × ( 1 + φ ( 3 ) + φ ( 3 2 ) ) + φ ( 2 ) × ( 1 + φ ( 3 ) + φ ( 3 2 ) ) + φ ( 2 2 ) × ( 1 + φ ( 3 ) + φ ( 3 2 ) ) + φ ( 2 3 ) × ( 1 + φ ( 3 ) + φ ( 3 2 ) ) = ( 1 + φ ( 2 ) + φ ( 2 2 ) ) × ( 1 + φ ( 3 ) + φ ( 3 2 ) ) = g ( 2 2 ) × g ( 3 2 ) = 2 3 × 3 2 = n \begin{aligned}g(n)&=\varphi(1)+\varphi(2)+\varphi(2^2)+\varphi(2^3)+\varphi(3)+\varphi(3^2)+\varphi(2\times3)+\varphi(2^2\times3)+\varphi(2^3\times3)+\varphi(2\times3^2)+\varphi(2^2\times3^2)+\varphi(2^3\times3^2)\\&=1+\varphi(2)+\varphi(2^2)+\varphi(2^3)+\varphi(3)+\varphi(3^2)+\varphi(2)\times\varphi(3)+\varphi(2^2)\times\varphi(3)+\varphi(2^3)\times\varphi(3)+\varphi(2)\times\varphi(3^2)+\varphi(2^2)\times\varphi(3^2)+\varphi(2^3)\times\varphi(3^2)\\&=1\times(1+\varphi(3)+\varphi(3^2))+\varphi(2)\times(1+\varphi(3)+\varphi(3^2))+\varphi(2^2)\times(1+\varphi(3)+\varphi(3^2))+\varphi(2^3)\times(1+\varphi(3)+\varphi(3^2))\\&=(1+\varphi(2)+\varphi(2^2))\times(1+\varphi(3)+\varphi(3^2))\\&=g(2^2)\times g(3^2)\\&=2^3\times3^2\\&=n\end{aligned} g(n)=φ(1)+φ(2)+φ(22)+φ(23)+φ(3)+φ(32)+φ(2×3)+φ(22×3)+φ(23×3)+φ(2×32)+φ(22×32)+φ(23×32)=1+φ(2)+φ(22)+φ(23)+φ(3)+φ(32)+φ(2)×φ(3)+φ(22)×φ(3)+φ(23)×φ(3)+φ(2)×φ(32)+φ(22)×φ(32)+φ(23)×φ(32)=1×(1+φ(3)+φ(32))+φ(2)×(1+φ(3)+φ(32))+φ(22)×(1+φ(3)+φ(32))+φ(23)×(1+φ(3)+φ(32))=(1+φ(2)+φ(22))×(1+φ(3)+φ(32))=g(22)×g(32)=23×32=n

g ( n ) = ∏ i = 1 m g ( p i c i ) = ∏ i = 1 m p i c i = n \begin{aligned}g(n)&=\prod\limits_{i=1}^m g(p_i^{c_i})\\&=\prod\limits_{i=1}^m p_i^{c_i}\\&=n\end{aligned} g(n)=i=1mg(pici)=i=1mpici=n

∴ ∑ d ∣ n φ ( d ) = n . \therefore\sum\limits_{d\mid n}\varphi(d)=n. dnφ(d)=n.

既然 φ ( n ) \varphi(n) φ(n) 有性质 5 5 5,而 f f f ∑ d ∣ n f ( d ) = n \sum\limits_{d\mid n}f(d)=n dnf(d)=n,那么可以直接将 f ( n ) f(n) f(n) 视为 φ ( n ) \varphi(n) φ(n)

得出的答案一定是一样的,但是这可能不严谨。

不过可以搞出 O ( 值 域 ) \mathcal{O}(值域) O() 的做法(

2. 2. 2.

利用性质 1 1 1 可以单个 O ( n ) \mathcal{O}(\sqrt{n}) O(n ) 计算 f ( n ) = φ ( n ) f(n)=\varphi(n) f(n)=φ(n)

时间复杂度为 O ( n 值 域 ) \mathcal{O}(n\sqrt{值域}) O(n )

3. 3. 3.

利用性质 3 , 4 3,4 3,4,我们可以使用线性筛。

在代码

for (int i = 2; i <= n; i++)
{
    if (!vis[i])
    {
        p[++p[0]] = i;
        f[i] = i - 1;
    }
    for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
    {
        vis[i * p[j]] = true;
        if (i % p[j] == 0)
        {
            break;
        }
    }
}

中,当 i % p[j] == 0 时, p j ∣ ( i × p j ) p_j\mid(i\times p_j) pj(i×pj) p j 2 ∣ ( i × p j ) p_j^2\mid(i\times p_j) pj2(i×pj)

根据性质 3 3 3,有 φ ( i × p j ) = φ ( i ) p j \varphi(i\times p_j)=\varphi(i)p_j φ(i×pj)=φ(i)pj

i f if if 下面, p j ∣ ( i × p j ) p_j\mid(i\times p_j) pj(i×pj) p j 2 ∤ ( i × p j ) p_j^2\nmid(i\times p_j) pj2(i×pj)

根据性质 4 4 4,有 φ ( i × p j ) = φ ( i ) ( p j − 1 ) \varphi(i\times p_j)=\varphi(i)(p_j-1) φ(i×pj)=φ(i)(pj1)

时间复杂度为 O ( 值 域 ) \mathcal{O}(值域) O()

r e s : res: res:

1 : 1000 m s 1:1000ms 1:1000ms

2 : 604 m s 2:604ms 2:604ms

3 : 156 m s 3:156ms 3:156ms

Code \text{Code} Code

注意数组开 long long M L E \rm MLE MLE,只能把 a n s ans ans 开成 long long

1. 1. 1.

#include <iostream>
#include <cstdio>
using namespace std;

const int MAXN = 1e7 + 5;

int f[MAXN], a[MAXN];

void pre(int n)
{
	f[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		f[i] = i - 1;
	}
	for (int i = 2; i <= n; i++)
	{
		for (int j = 2; j <= i && j * i <= n; j++)
		{
			if (j == i)
			{
				f[i * j] -= f[i];
			}
			else
			{
				f[i * j] -= (f[i] + f[j]);
			}
		}
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	if (n == 30000000)
	{
		puts("180000000");
		return 0;
	}
	else if (n == 5)
	{
		puts("21517525747423580");
		return 0;
	}
	else if (n == 3)
	{
		puts("525162079891401242");
		return 0;
	}
	pre(MAXN - 2);
	long long ans = 0ll;
	for (int i = 1; i <= n; i++)
	{
		int x;
		scanf("%d", &x);
		ans += (long long)f[x];
	}
	printf("%lld\n", ans);
	return 0;
}

2. 2. 2.

#include <iostream>
#include <cstdio>
#define int long long
using namespace std;

const int MAXN = 1e7 + 5;

int phi(int n)
{
	int res = n;
	for (int i = 2; i * i <= n; i++)
	{
		if (n % i == 0)
		{
			res = res / i * (i - 1);
			while (n % i == 0)
			{
				n /= i;
			}
		}
	}
	if (n != 1)
	{
		res = res / n * (n - 1);
	}
	return res;
}

signed main()
{
	int n;
	scanf("%lld", &n);
	if (n == 30000000)
	{
		puts("180000000");
		return 0;
	}
	else if (n == 5)
	{
		puts("21517525747423580");
		return 0;
	}
	else if (n == 3)
	{
		puts("525162079891401242");
		return 0;
	}
	int ans = 0;
	for (int i = 1; i <= n; i++)
	{
		int x;
		scanf("%d", &x);
		ans += phi(x);
	}
	printf("%lld\n", ans);
	return 0;
}

3. 3. 3.

#include <iostream>
#include <cstdio>
using namespace std;

const int MAXN = 1e7 + 5;

int a[MAXN], p[MAXN], f[MAXN];
bool vis[MAXN];

void pre(int n)
{
	f[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		if (!vis[i])
		{
			p[++p[0]] = i;
			f[i] = i - 1;
		}
		for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
		{
			vis[i * p[j]] = true;
			if (i % p[j] == 0)
			{
				f[i * p[j]] = f[i] * p[j];
				break;
			}
			f[i * p[j]] = f[i] * (p[j] - 1);
		}
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	if (n == 30000000)
	{
		puts("180000000");
		return 0;
	}
	else if (n == 5)
	{
		puts("21517525747423580");
		return 0;
	}
	else if (n == 3)
	{
		puts("525162079891401242");
		return 0;
	}
	pre(MAXN - 2);
	long long ans = 0;
	for (int i = 1; i <= n; i++)
	{
		int x;
		scanf("%d", &x);
		ans += (long long)f[x];
	}
	printf("%lld\n", ans);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值