这题目一看数学色彩就很浓
通过观察图(这个。。)我们就可以发现,如果按对角线剖分的话,两边可以看到的学生数都恰好是1~n-1范围内的互质数对数,即sigma(phi(i))
phi就是欧拉函数,关于线性求欧拉函数可以点这里:
http://blog.youkuaiyun.com/ji414341055/article/details/5771066
那么这题就基本已经解决了,答案就是1~n-1的欧拉函数和*2-1,需要注意的还有两个地方:开unsigned long long和特判n<2的情况
Code:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#define ll long long
#define ull unsigned long long
using namespace std;
bool f[40001];
ull p[40001];
ull ans[40001];
int main(){
int n,tot=0;
cin >>n;
if (n<=1){
cout <<0 <<endl;
return 0;
}
memset(f,false,sizeof(f));
f[1]=true;
for (int i=2;i<=n;i++){
if (!f[i]){
p[++tot]=i;
ans[i]=i-1;
}
for (int j=1;(j<=tot)&&(i*p[j]<=n);j++){
f[i*p[j]]=true;
if (i%p[j]==0){
ans[i*p[j]]=ans[i]*p[j];
break;
}
else{
ans[i*p[j]]=ans[i]*(p[j]-1);
}
}
}
long long pr=2;
for (int i=2;i<=n-1;i++) pr+=ans[i];
cout <<pr*2-1 <<endl;
return 0;
}