题目:
我是超链接
题解:
什么样的点会被挡住呢?当你能看到(i,j)时,(i*n,j*n)是看不到的
gcd(i,j)>1的点都被挡住,gcd=1就是能看到的点(这不就是i,j互质吗)
第一排第一列就弄成0吧,这样只是求了一半,另一半要*2,还要加上对称轴的1
学习了一下phi函数(欧拉函数)对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目
原理如下:
代码:
#include
using namespace std;
int p[40005],n;
void phi() //1-n的phi
{
p[1]=1;
for (int i=2; i<=n; i++)
if (!p[i])//线性筛素数
for (int j=i; j<=n; j+=i)
{
if (!p[j]) p[j]=j;
p[j]=p[j]/i*(i-1);
}
}
int phii(int x)//光求x的phi
{
int ans=x;
for (int i=2;i*i<=n;i++)
if (x%i==0)
{
ans=ans*(i-1)/i;
while (x%i==0) x/=i;//相当于筛素数
}
if (x>1) ans=ans*(x-1)/x;//自己是个素数
return ans;
}
int main() {
scanf("%d",n);
if (n==1) {
printf("0");
return 0;
}
phi();
int ans=0;
for (int i=1; i<=n-1; i++)
ans+=p[i];
printf("%d",ans*2+1);
}