水,只需要知道(X,Y)点为端点对应的线上的点的个数是gcd(x,y)+1(这里包含了两个端点),知道之后就欧拉函数走起
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
using namespace std;
#define MAX(x,y) (((x)>(y))?(x):(y))
#define MIN(x,y) (((x)<(y))?(x):(y))
#define N 500010
#define pi acos(-1.0)
#define inf 100000000
typedef long long ll;
typedef unsigned long long ull;
int phi[1010];
void phi_table(int n){
for(int i=2;i<=n;i++) phi[i]=0;
phi[1]=1;
for(int i=2;i<=n;i++){
if(!phi[i])
for(int j=i;j<=n;j+=i){
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
ll ans[1010];
int main(){
phi_table(1000);
for(int i=1;i<=1000;i++) ans[i]=ans[i-1]+phi[i];
int t,n;
scanf("%d",&t);
for(int count=1;count<=t;count++){
scanf("%d",&n);
printf("%d %d %lld\n",count,n,ans[n]*2+1);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 09:04:48