POJ3090_Visible Lattice Points【欧拉函数】
Memory Limit: 65536K
Accepted: 3331
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
Source
Greater New York 2006Visible Lattice Points
题目大意:如今有一个二维坐标系,仅仅有离散的整数坐标上有点。
如今站在N点向周围看去。问能看到多少个点。
假如看到了(2,1),那么(2,1)后边的(4,2)(6,3)…就被挡住
看不到了。
考虑1*1的时候,有三个点(1,0)(1,1)(0,1)。
(1,0)和(0,1)关于(1,1)对称
再看2*2的时候,有个点(1,0)(1,1)(2,1)(0,1)(1,2)
(1,0)和(0,1)关于(1,1)对称
(2,1)和(1,2)关于(1,1)对称
比1*1多了两个点。而且都是关于(1,1)对称,而(2,2)则被(1,1)遮挡住了
所以我们仅仅考虑下三角的情况。得出结果*2+1就是终于答案。
由于同斜率的点都被第一个点盖掉看不到了。所以我们仅仅考虑斜率有多少种就是得出结果了。
1*1的时候。斜率有0
2*2的时候,斜率有0,1/2
3*3的时候,斜率有0,1/2,1/3,2/3
4*4的时候,斜率有0,1/2(2/4),1/3,2/3,1/4,3/4;
5*5的时候,斜率有0,1/2(2/4),1/3,2/3,1/4,3/4,1/5,2/5,3/5,4/5
6*6的时候,斜率有0,1/2(2/4,3/6),1/3(2/6),2/3(4/6),1/4,3/4,1/5,2/5,3/5,4/5,1/6,5/6
能够看出,事实上就是求分母小于等于N的真分数有多少
那么就是单纯的欧拉函数了,这里用普通欧拉函数和高速求欧拉函数都能够
參考博文:http://blog.csdn.net/zhang20072844/article/details/8108727
#include<stdio.h> int prime[1010],phi[1001];
bool unprime[1010]; void Euler()//高速求欧拉函数
{
int i,j,k = 0; for(i = 2; i <= 1000; i++)
{
if(!unprime[i])
{
prime[k++] = i;
phi[i] = i-1;
} for(j = 0; j < k && i*prime[j] <= 1000; j++)
{
unprime[prime[j]*i] = true;
if(i % prime[j] != 0)
phi[prime[j]*i] = phi[i] * (prime[j]-1);
else
{
phi[prime[j]*i] = phi[i] * prime[j];
break;
}
}
}
}
int main()
{
int C,n;
Euler();
phi[1]=1;
scanf("%d",&C);
int kase = 1;
while(C--)
{
scanf("%d",&n);
int sum = 0;
for(int i = 1;i <= n; i++)
sum += phi[i];
printf("%d %d %d\n",kase++,n,2*sum+1);
}
return 0;
}
#include <stdio.h>
#include <math.h>
int Euler(int n)//普通求欧拉函数
{
int i,ret = n;
for(i = 2; i <= sqrt(1.0*n); i++)
{
if(n % i == 0)
{
ret = ret - ret/i;
}
while(n % i == 0)
n /= i;
}
if(n > 1)
ret = ret - ret/n;
return ret;
}
int main()
{ int C,n;
scanf("%d",&C);
int kase = 1;
while(C--)
{
scanf("%d",&n);
int sum = 0;
for(int i = 1;i <= n; i++)
sum += Euler(i);
printf("%d %d %d\n",kase++,n,2*sum+1);
}
}
POJ3090_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)的连点不经过其它的点. 思路:显而易见, ...
- [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)不互质,则 ...
- 数论 - 欧拉函数的运用 --- poj 3090 : Visible Lattice Points
Visible Lattice Points Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5636 Accepted: ...
- 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), ...
- zoj 2777 Visible Lattice Points(欧拉函数,基础)
题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<algo ...
- POJ 3090 Visible Lattice Points 【欧拉函数】
<题目链接> 题目大意: 给出范围为(0, 0)到(n, n)的整点,你站在(0,0)处,问能够看见几个点. 解题分析:很明显,因为 N (1 ≤ N ≤ 1000) ,所以无论 N 为多 ...
- POJ 3090 Visible Lattice Points | 其实是欧拉函数
题目: 给一个n,n的网格,点可以遮挡视线,问从0,0看能看到多少点 题解: 根据对称性,我们可以把网格按y=x为对称轴划分成两半,求一半的就可以了,可以想到的是应该每种斜率只能看到一个点 因为斜率表 ...
随机推荐
- Objective-C NSObject 的实现分析(2014-10-23更新)
NSObject 的实现分析 转载请注名出处 http://blog.csdn.net/uxyheaven iOS 的 NSObject 类没有开源, 可是呢 runtime开源了,里面有个类 Obj ...
- 算法8-4:Kruskal算法
Kruskal算法用于计算一个图的最小生成树.这个算法的过程例如以下: 依照边的权重从小到达进行排序 依次将每条边添加到最小生成树中,除非这条边会造成回路 实现思路 第一个步骤须要对边进行排序,排序方 ...
- UVA 11324 - The Largest Clique(强连通分量+缩点)
UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...
- 从零开始学Xamarin.Forms(一) 概述
原文:从零开始学Xamarin.Forms(一) 概述 Xamarin 读 "ˈzæmərin",是一个基于开源项目mono的能够使用C#开发的收费的跨平台(iOS.And ...
- Windows Phone开发(6):处理屏幕方向的改变
原文:Windows Phone开发(6):处理屏幕方向的改变 俺们都知道,智能手机可以通过旋转手机来改变屏幕的显示方向,更多的时候,对于屏幕方向的改变,我们要做出相应的处理,例如,当手机屏幕方向从纵 ...
- SplitContainer如何实现左侧导航,正确显示和导航内容
关于这种类型的设计有很多的实现,这样,我首先解释一下我使用: 我的原则是实现方式,将form嵌panel在,作为一个子窗口. 如下面的代码细节: Form form = new DataSelect( ...
- 【解决】/usr/bin/ld: cannot find -lc
现象:运行gcc静态编译程序时报错: /usr/bin/ld: cannot find -lc collect2: ld returned 1 exit statusmake: *** [gcc_dr ...
- Hdu 5256 系列转换
主题链接: HDU5236 代码: #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- java.net.SocketException: Unconnected sockets not implemented 解
JDK 这一问题的版本号,至Oracle公司JDK版本号bug.于6u12-rev号修复了该问题 请将JDK版本号升级到 1.6.0_12-b05 以上.推荐1.6.0_37 http://b ...
- gcc #define 学习记录
//test.c #include <stdio.h> #include <stdlib.h> //字符串化运算符 #define EXPAND(name) ({ \ prin ...