POJ_3090 Visible Lattice Points 【欧拉函数 + 递推】
一、题目
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
二、题意分析
这题题意比较好懂,给定一个数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 【欧拉函数 + 递推】的更多相关文章
- POJ3090 Visible Lattice Points 欧拉函数
欧拉函数裸题,直接欧拉函数值乘二加一就行了.具体证明略,反正很简单. 题干: Description A lattice point (x, y) in the first quadrant (x a ...
- POJ 3090 Visible Lattice Points 欧拉函数
链接:http://poj.org/problem?id=3090 题意:在坐标系中,从横纵坐标 0 ≤ x, y ≤ N中的点中选择点,而且这些点与(0,0)的连点不经过其它的点. 思路:显而易见, ...
- UVA 11426 (欧拉函数&&递推)
题意:给你一个数N,求N以内和N的最大公约数的和 解题思路: 一开始直接想暴力做,4000000的数据量肯定超时.之后学习了一些新的操作. 题目中所要我们求的是N内gcd之和,设s[n]=s[n-1] ...
- [poj 3090]Visible Lattice Point[欧拉函数]
找出N*N范围内可见格点的个数. 只考虑下半三角形区域,可以从可见格点的生成过程发现如下规律: 若横纵坐标c,r均从0开始标号,则 (c,r)为可见格点 <=>r与c互质 证明: 若r与c ...
- POJ3090 Visible Lattice Points 欧拉筛
题目大意:给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 线y=x和坐标轴上的点都被(1,0)(0,1)(1,1)挡住了.除这三个钉子外,如果一个点(x,y)不互质,则 ...
- BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)
LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Orig ...
- POJ3090 Visible Lattice Points
/* * POJ3090 Visible Lattice Points * 欧拉函数 */ #include<cstdio> using namespace std; int C,N; / ...
- hdu1787 GCD Again poj 2478 Farey Sequence 欧拉函数
hdu1787,直接求欧拉函数 #include <iostream> #include <cstdio> using namespace std; int n; int ph ...
- 【转】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& ...
随机推荐
- angular.js简单入门。
小弟刚接触angular js 就写了一个简单的入门.后续慢慢补... 首先看 html 页面. <html> <meta charset="UTF-8"> ...
- bootstrap设计网站中添加代码高亮插件
这款插件的名字叫做google-code-prettify 使用该插件之前的效果: 使用插件之后的效果: 接下来说步骤: (1)下载两个文件 http://codecloud.sinaapp.com/ ...
- 598. Range Addition II 矩阵的范围叠加
[抄题]: Given an m * n matrix M initialized with all 0's and several update operations. Operations are ...
- 409. Longest Palindrome 最长对称串
[抄题]: Given a string which consists of lowercase or uppercase letters, find the length of the longes ...
- 解决在Python中使用Win32api报错的问题,No module named win32api
一.系统环境 操作系统: Win7 64位 Python:3.7.0 二.在使用import win32api时,报错:No module named win32api 网上查到有下面解决办法: 方法 ...
- c# 下实现ping 命令操作
1>通过.net提供的类实现 using System; using System.Collections.Generic; using System.Linq; using System.Te ...
- readfile()
readfile()将一个文件写入到输出缓存参数1:文件名
- C++语法知识小结(持续更新中)
1)在适用构造函数创建对象时,有时会创建临时对象.如 Stock::Stock(const std::string & co,long n,double pr); 在使用时,下面两条语句有根本 ...
- MongoDB整理笔记の增加节点
MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境 ...
- Fragment生命周期及在viewpager中的生命周期
简介 本篇博客主要从一下三个方面介绍fragement的生命周期 1.fragment的生命周期及与Activity的生命周期的比较 2.FrameLayou布局添加.替换Fragment时fragm ...