题目:
题解:
先考虑
x
=
y
x=y
x=y一边的情况,如果可见,则横纵坐标互质,所以使用欧拉函数,求出对于每一个横坐标
x
x
x,求出
o
u
l
a
(
x
)
oula(x)
oula(x),相加,得到一边情况,乘以二,是两边的情况,再加上一个线上的特殊情况
x
=
1
x=1
x=1
#include <bits/stdc++.h>
using namespace std;
int pri[1005],st[1005],primes[1005];
int con;
void oula()
{
pri[1]=1;
for(int i=2;i<=1005;i++)
{
if(!st[i])
{
primes[++con]=i;
pri[i]=i-1;
}
for(int j=1;primes[j]<=1005/i;j++)
{
int t=primes[j]*i;
st[t]=1;
if(i%primes[j]==0)
{
pri[t]=pri[i]*primes[j];
break;
}
pri[t]=pri[i]*(primes[j]-1);
}
}
}
int main()
{
int n;
cin>>n;
oula();
int c=1;
while(n--)
{
int x;
cin>>x;
long long ans=0;
for(int i=1;i<=x;i++) ans+=pri[i];
ans*=2;
ans+=1;
cout<<c<<" "<<x<<" "<<ans<<endl;
c++;
}
return 0;
}