1. 程式人生 > >【數學】JZOJ_3927 可見點數 洛谷_2158 儀仗隊

【數學】JZOJ_3927 可見點數 洛谷_2158 儀仗隊

題意

給出一個N×NN\times N的點陣,求出從(0,0)(0,0)的點上最多能看到多少個點。

思路

我們可以先找一找規律發現當一個點的座標xxyy互質時它可以被看見。然後可以發現NN每增長11,外面只多了一圈,由於yy知道了,那麼我們只用求出有多少個數和它互質,就會想到用尤拉函式,我們只計算一邊的,因為對稱,所以我們只用求一邊的,答案就×2\times 2,一開始的周圍33個特殊,最後加上去。

程式碼

#include<cstdio>

int N;
long long ans;
long long phi[100001];

int main() {
	scanf
("%d", &N); if (N == 1) { printf("0"); return 0; } for (int i = 2; i < N; i++) phi[i] = i; for (int i = 2; i < N; i++) { if (phi[i] == i) for (int j = i; j <= N; j += i) phi[j] = phi[j] * (i - 1) / i; ans += phi[i]; } printf("%lld", ans * 2 + 3); }