POJ 3090 欧拉函数

链接:

http://poj.org/problem?id=3090

题意:

有一个n*n的二维格点,问在原点(0,0)处能看到多少个格点?

题解:

计算每个数的欧拉函数,然后就是前缀和*2+1就可以了

代码:

31 int getphi(int n) {
32     int ans = n;
33     for(int i = 2; i*i <= n; i++) {
34         if (n%i == 0) {
35             ans -= ans / i;
36             while (n%i == 0) n /= i;
37         }
38     }
39     if (n > 1) ans -= ans / n;
40     return ans;
41 }
42 
43 int a[MAXN];
44 
45 int main() {
46     ios::sync_with_stdio(false), cin.tie(0);
47     rep(i, 1, MAXN) a[i] = getphi(i), a[i] += a[i - 1];
48     int T;
49     cin >> T;
50     rep(cas, 1, T + 1) {
51         int x;
52         cin >> x;
53         cout << cas << ' ' << x << ' ' << a[x] * 2 + 1 << endl;
54     }
55     return 0;
56 }

 

posted @ 2017-10-02 13:03  Flowersea  阅读(148)  评论(0编辑  收藏  举报