【數學】JZOJ_3927 可見點數 洛谷_2158 儀仗隊
阿新 • • 發佈:2018-12-18
題意
給出一個的點陣,求出從的點上最多能看到多少個點。
思路
我們可以先找一找規律發現當一個點的座標和互質時它可以被看見。然後可以發現每增長,外面只多了一圈,由於知道了,那麼我們只用求出有多少個數和它互質,就會想到用尤拉函式,我們只計算一邊的,因為對稱,所以我們只用求一邊的,答案就,一開始的周圍個特殊,最後加上去。
程式碼
#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);
}