[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互质的数的个数 好了,我把规 ...
随机推荐
- mysql事务(二)——控制语句使用
事务控制 一般来说,mysql默认开启了事务自动提交功能,每条sql执行都会提交事务.可以使用如下语句关闭事务自动提交功能. show session variables like 'autocomm ...
- linux常用命令:traceroute 命令
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一 ...
- Linux基础命令---ar
ar ar指令可以创建.修改库,也可以从库中提取单个模块.库是一个单独的文件,里面包含了按照特定结构组织起来的其他文件,我们称作member.归档文件通常是一个二进制文件,我们一般将归档文件当作库来使 ...
- 删除github上个人的repositories的操作步骤
- pyDay5
内容来自廖雪峰的官方网站 1.递归函数的优点是定义简单,逻辑清晰. 2.使用递归函数需要注意防止栈溢出. 3.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会 ...
- Redis 如何保持和MySQL数据一致【一】
1. MySQL持久化数据,Redis只读数据redis在启动之后,从数据库加载数据.读请求:不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取写请求:数据首先都写到数据库,之后 ...
- JRebel for IntelliJ 热部署破解方法
1.打开idea,然后打开设置. 2.点击Plugins 3.重启之后点击 4.下载激活JRebel的插件,下载地址:https://github.com/ilanyu/ReverseProxy/re ...
- 一个改写MBR的例子
前言 想要对MBR类的病毒进行一下研究与学习,在此期间,看了很多资料,其中帮助最大的就是金龟子学姐和willj学长发表的文章.一个从源码与实现角度来讲了一下,另外一个从反病毒角度来分析. 功能描述 ...
- Springboot2.x 集成redis
pom.xml 添加 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...
- spring boot 多数据源分布式事务处理
有参考文章 ,但是自己没有测试.