一、题目

A lattice point (xy) 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 (xy) 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 (xy) with 0 ≤ xy ≤ 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 (xy) with 0 ≤ xy ≤ 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

二、题意分析

这题题意比较好懂,给定一个数N,代表这个二维平面里在第一象限的一个正方形的边长,就可以得到(N+1)*(N+1)个整点。然后问在除原点的外的(N+1)^2-1个点中,有多少个点与原点相连后,两点连成的线段之间是木有整点的。

补充个营养:看过《挑战程序设计竞赛》的同学肯定知道,给定一个直角三角形的两条边的边长a,b,那么gcd(a,b)+1就代表这条边上的整点数目。除去两个端点那么gcd(a,b)-1=0不就是这题所要满足的吗,也就是gcd(a,b)=1。

转换:这题通过上面的知识就可以转换成求一个数N的欧拉函数值。然后我们分析一下,N=1的时候一共4个点中,除去原点有3个点满足,结果为F[1] = 3。N=2的时候一共9个点,N=1时满足的点在此时也必然满足。这里需要注意的是,因为是在二维平面,那么最外面一条边上有φ(2)个点满足的话,那么另外一条边上也有φ(2)个点满足,那么就是 F[1] + 2*φ(2)。后面的原理相同,就得到了递推式

F[N] = F[N-1] + 2*φ(N),其中F[1] = 3

然后先线性筛法打表求欧拉函数的值,再用另外一个数组递推即可。

三、代码

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1e3+5;
int Prime[MAXN], Phi[MAXN], nPrime;
long long Ans[MAXN]; void Euler()
{
memset(Phi, 0, sizeof(Phi));
Phi[1] = 1;
nPrime = 0;
for(int i = 2; i < MAXN; i++)
{
if(!Phi[i])
{
Phi[i] = i-1;
Prime[nPrime++] = i;
}
for(int j = 0; j < nPrime && i*Prime[j] < MAXN; j++)
{
if(i%Prime[j])
{
Phi[i*Prime[j]] = Phi[i]*(Prime[j] - 1);
}
else
{
Phi[i*Prime[j]] = Phi[i]*Prime[j];
break;
}
}
}
} void solve()
{
Euler();
Ans[1] = 3;
for(int i = 2; i < MAXN; i++)
{
Ans[i] = Ans[i-1] + Phi[i]*2;
}
} int main()
{
int T, N;
cin >> T;
solve();
for(int i = 1; i <= T; i++)
{
cin >> N;
cout << i << ' ' << N << ' ' << Ans[N] << endl;
}
return 0;
}

  

POJ_3090 Visible Lattice Points 【欧拉函数 + 递推】的更多相关文章

  1. POJ3090 Visible Lattice Points 欧拉函数

    欧拉函数裸题,直接欧拉函数值乘二加一就行了.具体证明略,反正很简单. 题干: Description A lattice point (x, y) in the first quadrant (x a ...

  2. POJ 3090 Visible Lattice Points 欧拉函数

    链接:http://poj.org/problem?id=3090 题意:在坐标系中,从横纵坐标 0 ≤ x, y ≤ N中的点中选择点,而且这些点与(0,0)的连点不经过其它的点. 思路:显而易见, ...

  3. UVA 11426 (欧拉函数&&递推)

    题意:给你一个数N,求N以内和N的最大公约数的和 解题思路: 一开始直接想暴力做,4000000的数据量肯定超时.之后学习了一些新的操作. 题目中所要我们求的是N内gcd之和,设s[n]=s[n-1] ...

  4. [poj 3090]Visible Lattice Point[欧拉函数]

    找出N*N范围内可见格点的个数. 只考虑下半三角形区域,可以从可见格点的生成过程发现如下规律: 若横纵坐标c,r均从0开始标号,则 (c,r)为可见格点 <=>r与c互质 证明: 若r与c ...

  5. POJ3090 Visible Lattice Points 欧拉筛

    题目大意:给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 线y=x和坐标轴上的点都被(1,0)(0,1)(1,1)挡住了.除这三个钉子外,如果一个点(x,y)不互质,则 ...

  6. BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)

    LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB   This problem will be judged on UVALive. Orig ...

  7. POJ3090 Visible Lattice Points

    /* * POJ3090 Visible Lattice Points * 欧拉函数 */ #include<cstdio> using namespace std; int C,N; / ...

  8. hdu1787 GCD Again poj 2478 Farey Sequence 欧拉函数

    hdu1787,直接求欧拉函数 #include <iostream> #include <cstdio> using namespace std; int n; int ph ...

  9. 【转】UVALive 5964 LCM Extreme --欧拉函数

    题目大意:求lcm(1,2)+lcm(1,3)+lcm(2,3)+....+lcm(1,n)+....+lcm(n-2,n)+lcm(n-1,n)解法:设sum(n)为sum(lcm(i,j))(1& ...

随机推荐

  1. 819. Most Common Word 统计高频词(暂未被禁止)

    [抄题]: Given a paragraph and a list of banned words, return the most frequent word that is not in the ...

  2. 3.Dynamic Layout 动态布局。在槽中处理布局

    在应用程序中,一个界面的布局基本都是固定的. 在这个实例中,我们把管理布局的代码放在槽中.这样点击一次按钮,触发槽.布局改变一次.这样就成为一个动态布局. (一) 水平和竖直布局改变 横向: 纵向: ...

  3. Part4_lesson2---ARM处理器这个硬件启动流程分析

    1.启动方式 s3c2440:可以从Nor flash启动,Nor flash一般是2MB:也可以从Nandflash启动,它一般是256MB,我们习惯上把我们的uboot,内核以及文件系统都放到Na ...

  4. js实现选项卡切换

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  5. wp7启动+幻灯片效果

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Wi ...

  6. angular 事件绑定

    <button (click)="onClick($event)">点我</button> import { Component, OnInit } fro ...

  7. angular 路由传参

    第一种:<a [routerLink]="['/product']" [queryParams]="{id: 1}">商品详情</a> ...

  8. c++基类指针指向继承类调用继承类函数

      类里面重载运算符>>, 需要使用友元函数,而友元函数,不能作为虚函数. 所以,基类指针无法直接调用继承类里重构的 >>  ; 使用类转换,能解决掉,基类指针 调用 继承类 ...

  9. Kotlin when 流程判断

    如果学过C或者java C#等语言. 一定熟悉SWITCH这个流程判断 但是在kotlin中却没有这个.而是 使用了When来代替. 当什么时候. 下面我觉一个简单的例子: import java.u ...

  10. 20165219 《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20165219 <Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:王彦博 学号:20165219 成绩: 指导教 ...