[欧拉函数] P2158 [SDOI2008] 仪仗队
题目描述
作为体育委员,C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的 N \times NN×N 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。
现在,C 君希望你告诉他队伍整齐时能看到的学生人数。
输入格式
一行,一个正整数 N。
输入输出样例
输入
4
输出
9
通过观察,我们发现只有横纵坐标互质的点能够被看到,并且我们发现上图关于y=x对称。(注意:横纵坐标从0~n-1)
那问题转化为了求1~n-1中每个数的欧拉函数。
最终答案为和的二倍加一,因为对称轴上还有一个。
什么是欧拉函数?
欧拉函数:φ(n)表示1~n中与n互质的数的个数
How to read φ? (fai)
结论:
1:当n为质数时,
2:
3:
4: 1~n中与n互质的数的和为
4: 当n>=2是
5: 若p|n且
6:
如何求欧拉函数?
n质因数分解可以表示为:
所以
由性质2得
综上欧拉函数公式为:
那么代码显而易见。
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现