找出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[欧拉函数]的更多相关文章

  1. POJ 3090 Visible Lattice Points 欧拉函数

    链接:http://poj.org/problem?id=3090 题意:在坐标系中,从横纵坐标 0 ≤ x, y ≤ N中的点中选择点,而且这些点与(0,0)的连点不经过其它的点. 思路:显而易见, ...

  2. POJ3090 Visible Lattice Points 欧拉函数

    欧拉函数裸题,直接欧拉函数值乘二加一就行了.具体证明略,反正很简单. 题干: Description A lattice point (x, y) in the first quadrant (x a ...

  3. 数论 - 欧拉函数的运用 --- poj 3090 : Visible Lattice Points

    Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5636   Accepted: ...

  4. POJ 3090 Visible Lattice Points 【欧拉函数】

    <题目链接> 题目大意: 给出范围为(0, 0)到(n, n)的整点,你站在(0,0)处,问能够看见几个点. 解题分析:很明显,因为 N (1 ≤ N ≤ 1000) ,所以无论 N 为多 ...

  5. POJ 3090 Visible Lattice Points | 其实是欧拉函数

    题目: 给一个n,n的网格,点可以遮挡视线,问从0,0看能看到多少点 题解: 根据对称性,我们可以把网格按y=x为对称轴划分成两半,求一半的就可以了,可以想到的是应该每种斜率只能看到一个点 因为斜率表 ...

  6. poj 3090 &amp;&amp; poj 2478(法雷级数,欧拉函数)

    http://poj.org/problem?id=3090 法雷级数 法雷级数的递推公式非常easy:f[1] = 2; f[i] = f[i-1]+phi[i]. 该题是法雷级数的变形吧,答案是2 ...

  7. POJ 2478 Farey Sequence(欧拉函数前n项和)

    A - Farey Sequence Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  8. poj 2480 Longge's problem [ 欧拉函数 ]

    传送门 Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7327   Accepted: 2 ...

  9. poj 3090 Visible Lattice Points(离线打表)

    这是好久之前做过的题,算是在考察欧拉函数的定义吧. 先把欧拉函数讲好:其实欧拉函数还是有很多解读的.emmm,最基础同时最重要的算是,¢(n)表示范围(1, n-1)中与n互质的数的个数 好了,我把规 ...

随机推荐

  1. Request 对象 response 对象 常见属性

    请求和响应 Express 应用使用回调函数的参数: request 和 response 对象来处理请求和响应的数据. app.get('/', function (req, res) { // - ...

  2. 循环ajax请求问题

    项目开发过程碰到过这种需求:需要循环发送ajax请求,请求参数和循环索引有关.第一次实现的时候用了类似下面的方法,结果发现发送到后端的参数数据都是最后一次循环的索引 for(var i=0; i< ...

  3. c++第十四天

    <c++ primer, 5E> 第91页到第94页,笔记: 1.vector支持的操作. v.empty().v.size().v.push_back(t).v[n] 2.试图通过下标访 ...

  4. Python Web学习笔记之面试TCP的15个问题

    网络协议那么多,为什么面试喜欢问TCP?原因无外乎两个:1.TCP协议直接与进程打交道,写网络程序要用:2.TCP协议设计十分精巧,在一个不可靠的IP网络上实现了可靠传输,因为精巧,掌握TCP的原理自 ...

  5. python Django编写登录项目

    Django 目录结构: __init__.py 文件: import pymysql pymysql.install_as_MySQLdb() 注意:如果 import pymysql 的时候报红, ...

  6. C++面向对象高级开发课程(第二周)

    1. 类中含有指针—— class with pointer member(s) ——的情况经常发生,典型的有:string 类. 2. STL中的 string 类太复杂,copy on write ...

  7. linux虚拟机中安装vm_tool的方法及用处

    解决问题:实现虚拟机VMware上linux与windows互相自由复制与粘贴.如在同一个系统下ctrl+c 与ctrl+v一样方便.解决了只能通过U盘摆渡复制的繁琐问题. 系统环境: 虚拟机VMwa ...

  8. 20145122《Android开发基础》实验四实验报告

    实验名称 Android开发基础 实验内容 1.Windows环境下Android Studio 2.能够运行安卓AVD模拟器 3.使用安卓虚拟手机显示HelloWorld以及自己的学号 统计的PSP ...

  9. MS08_067漏洞测试——20145301

    MS08_067漏洞测试 实验步骤 search MS08_067查看相关信息 show payloads命令查找需要的攻击载荷 选择generic/shell_reverse_tcp来获取漏洞主机的 ...

  10. 2018-2019-1 20189218《Linux内核原理与分析》第四周作业

    构造简单的Linux内核 显然用实验楼配好的环境做这个实验太简单了,按照没有困难制造困难也要上的原则,在自己的64位虚拟机上做这个实验. 按照课本(视频)上的步骤一直做下去,到编译生成init时出现了 ...