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为对称轴划分成两半,求一半的就可以了,可以想到的是应该每种斜率只能看到一个点 因为斜率表 ...
随机推荐
- 用KnockoutJS实现ToDoMVC代码分析
体验地址 Knockout 版todo web app在线体验 http://todomvc.com/examples/knockoutjs/ 源码地址 项目源码地址,此地址包含了各种JS框架实现的t ...
- JavaScript的作用域和变量对象
变量对象 先来说说什么是变量对象.变量对象中又存储了什么东西吧. JavaScript中的运行环境包含全局运行环境和函数运行环境这两种,每进入到一个运行环境都会创建一个变量对象,这个对象中记录了在当前 ...
- C++头文件保护符和变量的声明定义
1.#ifndef #define #endif头文件保护符 在编译的过程中,每个.cpp文件被看成一个单独的文件来编译成单独的编译单元,#ifndef 保证类的头文件在同一个.cpp文件里被多次引用 ...
- Linux内核——定时器和时间管理
定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...
- [IOS]本地化
我们在IOS开发应用中,会碰到做好的一个应用,如何趋向国际化,也就是说支持多种语言?下面我就来简单演示一下,用一个Demo来实现中文和英文的实现. 实现步骤: 1.本地化项目中xib的view 1.在 ...
- WCF配置文件
因为要上传较大的图片,WCF传递数组的默认的最大数组16KB就不够了.以下讲解配置内容. 服务端配置 这里一个WCF项目中有1个服务,配置文件如下(位于system.serviceModel标签中): ...
- quartz.net持久化和集群
首先你应该使用的是持久化的quartz,所有定时任务的情况都是保存在数据库表总的,每次启动时,scheduler容器都是按照qrtz_triggers等表内存储的信息来执行定时任务(主要包括cron表 ...
- Redis c/c++, java client连接
Redis 介绍 redis这个想必大家都了解,关于redis的安装參考这里,redis使用文档參见这里,英文文档. Redis Cclient的用法 Redis的cclient Hiredis使用比 ...
- NOI 评价体系 arbiter 安装方法 常见的问题 移植
#!/bin/bash AppPath="$PWD" 读取当前文件夹 echo "Arbiter is installing..." sudo apt-ge ...
- Caching-缓存架构与源码分析
Caching-缓存架构与源码分析 首先奉献caching的开源地址[微软源码] 1.工程架构 为了提高程序效率,我们经常将一些不频繁修改,但是使用了还很大的数据进行缓存.尤其是互联网产品,缓存可以说 ...