#Snow{ position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 99999; background: rgba(255,255,240,0.1); pointer-events: none; }

[欧拉函数] P2158 [SDOI2008] 仪仗队

题目描述
作为体育委员,C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的 N \times NN×N 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。
image
现在,C 君希望你告诉他队伍整齐时能看到的学生人数。

输入格式
一行,一个正整数 N。

输入输出样例
输入
4
输出
9


通过观察,我们发现只有横纵坐标互质的点能够被看到,并且我们发现上图关于y=x对称。(注意:横纵坐标从0~n-1)
那问题转化为了求1~n-1中每个数的欧拉函数。
最终答案为和的二倍加一,因为对称轴上还有一个。

什么是欧拉函数?

欧拉函数:φ(n)表示1~n中与n互质的数的个数
How to read φ? (fai)

结论:

1:当n为质数时,φ(n)=n1
2:φ(n)=i=1kpia1×(pi1)
3:x,y,φ(xy)=ϕ(x)ϕ(y)
4: 1~n中与n互质的数的和为 φ(n)/2n(n>1)
4: 当n>=2是 φ(n)
5: 若p|n且p2|n 则 φ(n)=φ(np)p
6: d|nφ(d)=n

如何求欧拉函数?

n质因数分解可以表示为:
 n=i=1kpiai

所以
φ(n)=φ(i=1kpiai)=i=1kφ(piai)

由性质2得
φ(n)=i=1kpiai1(pi1)=ikpiai(11pi)=ni=1k(1pi)

综上欧拉函数公式为:
φ(n)=ni=1k(1pi)

那么代码显而易见。

#include<bits/stdc++.h>
using namespace std;
const int N=4e4+10;
int n;
int phi[N];
int main(){
	cin>>n;
	if(n==1)
	{
		printf("0");
		return 0;
	}
	for(int i=1;i<=n;i++) phi[i]=i;
	for(int i=2;i<=n;i++)
	{
		if(phi[i]!=i) continue;
		for(int j=i;j<=n;j+=i) phi[j]=phi[j]/i*(i-1);
	}
	int res=0;
	for(int i=1;i<n;i++) res+=phi[i];
	printf("%d",res*2+1);
	return 0;
}
posted @   繁花孤城  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示