[poj 3090]Visible Lattice Point[欧拉函数]
找出N*N范围内可见格点的个数.
只考虑下半三角形区域,可以从可见格点的生成过程发现如下规律:
若横纵坐标c,r均从0开始标号,则
(c,r)为可见格点 <=>r与c互质
证明:
若r与c有公因子1<b<min(r,c),则(c/b, r/b)在线段(0, 0)(c, r)上,则(c, r)不是可见格点.(充分性)
若r与c互质,显然线段上不存在整点,则(c, r)不是可见格点.(必要性)
φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值
也就是横坐标增1后纵坐标合法数目,即新增可见格点数(下半三角形区域).用时应乘二.
#include<stdio.h>
#include<string.h>
#include<math.h>
int ans[1005];
//由欧拉公式
//phi(m) = m * (p1-1)/p1 * (p2-1)/p2 * .. * (pn-1)/pn. pi为大于1且不超过m的与m互质的数 int eular(int n)
{
int s,i,m;
m=(int)sqrt(n+0.5);//出于精度问题考虑,其实就是开根号向下取整
s=n;
for(i=2; i<=m; i++)
if(n%i==0)//i是n的因数(如何保证是质数?看下文)
{
s=s/i*(i-1);//欧拉公式是连乘的,一项项乘
while(n%i==0)
n/=i;///去掉n中所有i因数,也就相当于筛掉了n中的i的倍数,使得此后i的倍数都不能整除"n"
}///那么下一个能够整除n的i一定是质数
if(n>1)
s=s/n*(n-1);
return s;
}
int main()
{
int n,i,t,cas=1;
scanf("%d",&t);
ans[1]=3;
for(i=2; i<=1000; i++)
ans[i]=ans[i-1]+eular(i)*2;
while(t--)
{
scanf("%d",&n);
printf("%d %d %d\n",cas++,n,ans[n]);
}
return 0;
}
自己敲一遍~
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 1005;
int ans[MAXN];
int eular(int n)
{
int i,s,m;
m = (int)sqrt(n+0.5);
s = n;
for(i = 2;i <= m;i++)
{
if(!(n%i))
{
s = s / i * (i-1);
while(!(n%i))
n /= i;
}
}
if(n>1)
s = s / n * (n-1);
///假设n可以分解为(升序排列)p[1], p[2], .. p[n-1], p[n]那么√n > p[n-1]
///反之 则 √n <= p[n-1]
/// => n <= p[n-1]*p[n-1] < p[n-1]*p[n] < p[1]*p[2]*..*p[n-1]*p[n] = n 矛盾
///因此,循环结束时,最多只剩下1个质因子.
return s;
} int main()
{
int T;
scanf("%d",&T);
memset(ans,0,sizeof(ans));
int last = 0;
ans[0] = 1;
for(int k=1;k<=T;k++)
{
int n;
scanf("%d",&n);
if(last>=n)
{
printf("%d\n",ans[n]);
continue;
}
for(int i=last+1;i<=n;i++)
{
ans[i] = ans[i-1] + 2*eular(i);
// printf("eular(%d) = %d\n",i,eular(i));
}
last = n;
printf("%d %d %d\n",k,n,ans[n]);
}
}
[poj 3090]Visible Lattice Point[欧拉函数]的更多相关文章
- POJ 3090 Visible Lattice Points 欧拉函数
链接:http://poj.org/problem?id=3090 题意:在坐标系中,从横纵坐标 0 ≤ x, y ≤ N中的点中选择点,而且这些点与(0,0)的连点不经过其它的点. 思路:显而易见, ...
- POJ3090 Visible Lattice Points 欧拉函数
欧拉函数裸题,直接欧拉函数值乘二加一就行了.具体证明略,反正很简单. 题干: Description A lattice point (x, y) in the first quadrant (x a ...
- 数论 - 欧拉函数的运用 --- poj 3090 : Visible Lattice Points
Visible Lattice Points Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5636 Accepted: ...
- 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为对称轴划分成两半,求一半的就可以了,可以想到的是应该每种斜率只能看到一个点 因为斜率表 ...
- poj 3090 && poj 2478(法雷级数,欧拉函数)
http://poj.org/problem?id=3090 法雷级数 法雷级数的递推公式非常easy:f[1] = 2; f[i] = f[i-1]+phi[i]. 该题是法雷级数的变形吧,答案是2 ...
- POJ 2478 Farey Sequence(欧拉函数前n项和)
A - Farey Sequence Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- poj 2480 Longge's problem [ 欧拉函数 ]
传送门 Longge's problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7327 Accepted: 2 ...
- poj 3090 Visible Lattice Points(离线打表)
这是好久之前做过的题,算是在考察欧拉函数的定义吧. 先把欧拉函数讲好:其实欧拉函数还是有很多解读的.emmm,最基础同时最重要的算是,¢(n)表示范围(1, n-1)中与n互质的数的个数 好了,我把规 ...
随机推荐
- FastJson(阿里巴巴)基础
一.所需jar包: fastjson-x.x.xx.jar(本例使用fastjson-1.1.36.jar). 二.解析转化: 1.json字符串 < ------ > js trin ...
- Node.js最新技术栈之Promise篇
前言 大家好,我是桑世龙,github和cnodejs上的i5ting,目前在天津创业,公司目前使用技术主要是nodejs,算所谓的MEAN(mongodb + express + angular + ...
- iOS原生的AVFoundation扫描二维码/条形码
#import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVCaptureMetadataOutputO ...
- JavaScript 添加新元素
JavaScript 添加新元素 版权声明:未经授权,严禁转载! 添加元素 创建元素 使用 JS 可以为一个已有的元素添加一个新的子元素. 第一步:创建空元素. - var elem = docume ...
- redis.windows.conf 参数说明
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/ru ...
- 20165310java_blog_week7
2165310 <Java程序设计>第7周学习总结 教材学习内容总结 通过JDBC管理数据库 原理图: 链接数据库方式 - `Connection getConnection(java.l ...
- c++builder ZIP文件解压与压缩(ZLIB DLL调用)(转载 )
转载:http://blog.csdn.net/goodai007/article/details/7414512 头文件:ZipAndFile.h //----------------------- ...
- MAC下BurpSuit社区版升级pro版
环境OSX 步骤1. 官网下载社区版v1.7.32https://portswigger.net/burp/communitydownload 安装 2. 下载keygenhttps://down.5 ...
- 如何去除 gvim 的 acp和 "option omnifunc is not set" 的问题
"option omnifunc is not set" 的问题, 确实是困扰了很久的问题! 首先, 在vim中,自动完成是通过两个文件来实现的, 自动完成, 就是 acp: = ...
- dp专题训练
****************************************************************************************** 动态规划 专题训练 ...