[欧拉函数] 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为质数时,\(\varphi(n)=n-1\)
2:\(\varphi(n)=\prod_{i=1}^{k}p_i^{a-1}\times(p_i-1)\)
3:\(x,y为质时,\varphi(xy)=\phi(x)\phi(y)\)
4: 1~n中与n互质的数的和为 \(\varphi(n)/2*n (n>1)\)
4: 当n>=2是 \(\varphi(n)为偶数\)
5: 若p|n且\(p^2\)|n 则 \(\varphi(n)=\varphi(\frac{n}{p})*p\)
6: \(\sum_{d|n}\varphi(d)=n\)
如何求欧拉函数?
n质因数分解可以表示为:
\(\ n=\prod_{i=1}^{k}p_{i}^{a_i}\)
所以
\(\varphi(n)=\varphi(\prod_{i=1}^{k}p_{i}^{a_{i}})=\prod_{i=1}^{k}\varphi(p_{i}^{a_i})\)
由性质2得
\(\varphi(n)=\prod_{i=1}^{k}p_i^{a_i-1}*(p_i-1)=\prod_i^kp_i^{a_i}*(1-\frac{1}{p_i})=n\prod_{i=1}^k(1-p_i)\)
综上欧拉函数公式为:
\(\varphi(n)=n\prod_{i=1}^k(1-p_i)\)
那么代码显而易见。
#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;
}

浙公网安备 33010602011771号