POJ 3090 Visible Lattice Points

Visible Lattice Points

Time Limit: 1000MS Memory Limit: 65536K

Description

A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass through any other lattice point. For example, the point (4, 2) is not visible since the line from the origin passes through (2, 1). The figure below shows the points (x, y) with 0 ≤ x, y ≤ 5 with lines from the origin to the visible points.

Write a program which, given a value for the size, N, computes the number of visible points (x, y) with 0 ≤ x, y ≤ N.

Input

The first line of input contains a single integer C (1 ≤ C ≤ 1000) which is the number of datasets that follow.

Each dataset consists of a single line of input containing a single integer N (1 ≤ N ≤ 1000), which is the size.

Output

For each dataset, there is to be one line of output consisting of: the dataset number starting at 1, a single space, the size, a single space and the number of visible points for that size.

Sample Input

4
2
4
5
231

Sample Output

1 2 5
2 4 13
3 5 21
4 231 32549

题意:

题目要求我们求出有多少个点不在同一个直线上,同时符合 0 ≤ x, y ≤ N.。

思路:

不再同一条直线上就说明k不同,所以也就是说y / x的不同,所以也就是gcd(x, y) = 1这样可以让k最简,而如果不等于1的时候,那么被等于1的时候给覆盖,所以就是求欧拉函数就行了,最后因为x,y的值可以互换,所以就每个欧拉值要乘2,因为还有一个对称轴(1, 1)所在的线,所以前缀和要+1。

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1010;
int sum[maxn], phi[maxn], prime[maxn];
bool book[maxn] = {false};
void GetPhi() {
    int cnt = 0;
    phi[1] = 1;
    for (int i = 2; i < maxn; i++) {
        if (!book[i]) {
            phi[i] = i - 1;
            prime[cnt++] = i;
        }
        for (int j = 0; j < maxn && prime[j] * i < maxn; j++) {
            int x = prime[j];
            book[x * i] = true;
            if (i % x == 0) {
                phi[i * x] = phi[i] * x;
                break;
            } else phi[i * x] = phi[i] * phi[x];
        }
    }
    sum[0] = 1;
    for (int i = 1; i < maxn; i++) {
        sum[i] = sum[i - 1] + phi[i] * 2;
    }
}
int main() {
    ios::sync_with_stdio(false);
    GetPhi();
    int t, n;
    scanf("%d", &t);
    for (int i = 1; i <= t; i++) {
        scanf("%d", &n);
        printf("%d %d %d\n", i, n, sum[n]);
    }
    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 11:29
已编辑
斯卡蒂味的鱼汤:知道你不会来数马,就不捞你😂最近数马疯狂扩招,招聘要求挺低的,你能力肯定够,应该就是因为太强了,知道你不会来才不捞你
投递腾讯云智研发等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务