题目描述
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
输入输出格式
输入格式:
共一个数N
输出格式:
共一个数,即C君应看到的学生人数。
输入输出样例
输入样例#1
4
输出样例#1
9
说明
【数据规模和约定】
对于 100% 的数据,1 ≤ N ≤ 40000
思路
这题我和我的一个同学一起推的,没想到思路对了。
这题就是求欧拉函数(小于n又与n互质的数的个数)。a[i]为有多少个小于i的与i互质的数。
求C君的点是(1,1),然后求有多少个点(1,1)相连斜率不同的一次函数y=kx。求k的个数。
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long int a[40001],n,s;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register long long int i,j,k;
s=2;
cin>>n;
if(n==1)
{
cout<<0<<endl;
return 0;
}
for(i=1;i<=n;i++) a[i]=i;
for(i=2;i<=n;i++)//比较快的筛法,学到了
{
if(a[i]==i)
{
for(j=i;j<=n;j+=i)
{
a[j]=a[j]/i*(i-1);
}
}
}
for(i=2;i<=n-1;i++)
{
s+=a[i]*2;
}
cout<<s+1<<endl;//(2,2)的点也算
return 0;
}