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为对称轴划分成两半,求一半的就可以了,可以想到的是应该每种斜率只能看到一个点 因为斜率表 ...
随机推荐
- ecshop 后台添加 成本价 利润
ecshop后台admin中的商品操作php文件,goods.php替换为下面的代码, 还要在数据库商品本店售价后门添加 cost 字段 为 商品成本价 ecs_goods表中添加 cost ...
- 去掉word中向下的箭头^l----->^p
去掉word中向下的箭头 在网页上复制文章到word中,会发现有很多向下的箭头,这些 符号叫做软回车符.如何去掉这些向下的箭头呢.步骤如下: 方法/步骤 按Ctrl+H,弹出全局替换窗口,输入查找内容 ...
- 开源论坛jforum的集成
Jforum是一款开源的java类的论坛,小巧高效,运用了很多JSP新技术,支持hsqldb.oracle.mysql. postgresql数据库,完全遵从MVC设计模式. 1.首先下载最新的版本( ...
- Redhat 6.3中syslog信息丢失
我们採用Linux的syslog来记录产品的debug log. 调用当中的一个可运行文件.运行完命令之后,查看debug log的信息,竟然从某一条log之后的log都丢失了.多次尝试后,发现每次都 ...
- Python学习入门基础教程(learning Python)--3.2 if-else分支语句
if-else分支语句结构的特点是当conditon条件满足时,执行if下的语句块,当condition条件不满足时执行else下的语句块,也就是说根据条件来控制让某些语句执行,某些语句不被执行. i ...
- java.lang.RuntimeException: Method called after release()
主要引起是因為在 camera.stopPreview(); camera.release(); 前沒有將setPreviewCallback 設置為null, 解決情況: public void ...
- 解决alaert.builder二次调用报错的bug
报错的代码是: The specified child already has a parent. You must call removeView() on the child's parent f ...
- template method pattern
//DataViewer.cs using System; namespace TemplateMethodSample { abstract class DataViewer { //抽象方法:获取 ...
- decorate pattern 装饰模式
[装饰模式的优缺点]装饰模式的优点:1.比静态继承更灵活:2.避免在层次结构高层的类有太多的特征装饰模式的缺点:1.使用装饰模式会产生比使用继承关系更多的对象.并且这些对象看上去都很想像,从而使得查错 ...
- 在mac os下编译android -相关文章
1. Mac OS X下编译Android源码 http://blog.csdn.net/bulreed/article/details/22783467 2.MAC OS 编译 Android源代码 ...