[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互质的数的个数 好了,我把规 ...
随机推荐
- 20165207 Exp4 恶意代码分析
目录 1.实验内容 1.1.系统运行监控 1.1.1.使用命令行创建计划任务 1.1.2.使用命令行借助批处理文件创建计划任务 1.1.3.分析netstat计划任务的最终结果 1.1.4.安装配置s ...
- 01: socket模块
网络编程其他篇 目录: 1.1 socket理论部分 1.2 socket处理单个连接 和 同时接受多个连接 1.3 socket实现远程执行命令,下载文件 1.4 通过socket实现简单的ssh ...
- 三步搞定 opencv 初始环境设定
一.设定bin的初始位置:比如我的电脑 D:\安装程序\opencv\build\x86\vc10\bin H:\生产力工具\opencv\build\x86\vc10\bin D:\安装程 ...
- 20162311 编写Android程序测试查找排序算法
20162311 编写Android程序测试查找排序算法 一.设置图形界面 因为是测试查找和排序算法,所以先要有一个目标数组.为了得到一个目标数组,我设置一个EditText和一个Button来添加数 ...
- bzoj 1497 最大获利 - 最小割
新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研 ...
- noip2008 真题练习 2017.2.25
不是有很多可以说的,记住不能边算边取min Code #include<iostream> #include<fstream> #include<sstream> ...
- Hexo 搭建 Blog 精简笔记
安装Hexo npm install -g hexo-cli Mac 用户 您在编译时可能会遇到问题,请先到 App Store 安装 Xcode,Xcode 完成后,启动并进入 Preference ...
- luoguP2574 XOR的艺术
思路 01串的区间求和,区间翻转 lazy%2==0 则不用翻转,lazt%2==1则要翻转 模板题 代码 #include <iostream> #include <vector& ...
- [BZOJ4244]邮戳拉力赛
Description IOI铁路是由N+2个站点构成的直线线路.这条线路的车站从某一端的车站开始顺次标号为0...N+1. 这条路线上行驶的电车分为上行电车和下行电车两种,上行电车沿编号增大方向行驶 ...
- 李白打酒|2014年蓝桥杯B组题解析第三题-fishers
李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次,遇到花 ...