找出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. linux常用命令:split 命令

    split是linux下常用的分割文件命令.Linux下文件分割可以通过split命令来实现,而用cat进行文件合并.而分割可以指定按行数分割和按大小分割两种模式. 1.命令格式: split [OP ...

  2. python服务器端、客户端的模型,客服端发送请求,服务端进行响应(web.py)

    服务器端.客户端的模型,客服端发送的请求,服务端的响应 相当于启动了一个web server install web.py 接口框架用到的包 http://webpy.org/tutorial3.zh ...

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

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

  4. iOS开发之AFNetworking实现数据传输和文件上传

    //传输数据 1 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.r ...

  5. 向大家分享一个shell脚本的坑

    打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...

  6. Linux下Oracle常用命令

    1. 备份表 exp database_user/pass tables='(table1,table2)' file=filename.dmp(例如:exp ismrenbao/iflytek ta ...

  7. ACM题目————区间覆盖问题

    题目描述 设x1 , x2,... , xn是实直线上的n个点.用固定长度的闭区间覆盖这n个点,至少需要多少个这样的固定长度闭区间?设计解此问题的有效算法,并证明算法的正确性.编程任务:对于给定的实直 ...

  8. Php cli模式下执行报错/usr/bin/php: /usr/local/lib/libxml2.so.2: no version information available (required by /usr/bin/php)

    centos下php cli模式报错 /usr/bin/php: /usr/local/lib/libxml2.so.2: no version information available (requ ...

  9. Android 拖动条 和 Handle

  10. 20145216史婧瑶《网络对抗》Web基础

    20145216史婧瑶<网络对抗>Web基础 实验问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签.表单域.表单按钮. (2)浏览器可以 ...