题目:http://poj.org/problem?id=3090
思路:分成两个三角形,则答案是欧拉公式求出的ans*2+3(零度四十五度和九十度的三条线)
代码:
//MEMORY 400K TIME 16MS
//还是欧拉公式
#include<cstdio>
#include<cstring>
using namespace std;
#define size 1005
bool judge[size];
int num[size];
long long sum[size];
int c,n,i,j;
void init(){
memset(judge,true,sizeof(judge));
for(i=2; i<size; i++)
if(judge[i])
for(j=2; i*j<size; j++)
judge[i*j]=false;
for(i=1;i<size;i++)
if(judge[i])num[i]=i-1;
else num[i]=i;
for(i=2;i<size;i++)
if(judge[i])
for(j=2;i*j<size;j++){
num[i*j]=num[i*j]/i*(i-1);
}
sum[1]=0;
sum[2]=1;
for(i=3;i<size;i++)
sum[i]=sum[i-1]+num[i];
for(i=1;i<size;i++)//这里的FOR要从1开始循环...因为N可以等于1
sum[i]=sum[i]*2+3;
}
int main()
{
init();
scanf("%d",&c);
for(i=1;i<=c;i++){
scanf("%d",&n);
printf("%d %d %lld\n",i,n,sum[n]);
}
}