一、题目

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. LoadRunner 事物

    添加事物 Action() { lr_start_transaction("openindex"); web_url("WebTours", "URL ...

  2. jmeter beanshell

    //获取返回数据 String json = prev.getResponseDataAsString(); ///加入变量vars.put("restr",json); //获取 ...

  3. Linux内核的特征

    Linux内核的特征 Linux是个人计算机和工作站上的Unix类操作系统.但是,它绝不是简化的Unix.相反,Linux是强有力和具有创新意义的Unix类操作系统.它不仅继承了Unix的特征,而且在 ...

  4. solidity错误处理

    官方文档: https://solidity.readthedocs.io/en/develop/control-structures.html#error-handling-assert-requi ...

  5. DBMS ODBC JDBC是什么?

    昨天躺在被窝里面看了几页电子书,今天写下来. 数据库就是存放数据的仓库. DBMS的意思是数据库管理系统,作用就是“管理”数据库的.“管理”这两个字简单说来就是“增删改查”.所以DBMS就是能够对数据 ...

  6. laravel查询最后执行的一条sql语句

  7. nodelet的应用

    1.创建一个包,如example_pkg catkin_create_pkg example_pkg 2.创建MyNodeletClass.h文件 cd ~/catkin_ws/src/example ...

  8. 通达OA整合教程

      资源下载地址: 通达OA 2015:http://pan.baidu.com/s/1qYMxsZU mysql下载:http://pan.baidu.com/s/1c2oVI5y 整合文件:htt ...

  9. BZOJ 3083 遥远的国度(树链剖分+LCA)

    Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要z ...

  10. Form1调用Unit2类中函数

    Form1有一个button,当Form1.Create时触发Button的OnClick事件,OnClick事件调用Unit2单元中的函数: unit Unit2; interface uses F ...