Visible Lattice Points(规律题)【数学规律】
Visible Lattice Points
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9031 | Accepted: 5490 |
Description
A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass through any other lattice point. For example, the point (4, 2) is not visible since the line from the origin passes through (2, 1). The figure below shows the points (x, y) with 0 ≤ x, y ≤ 5 with lines from the origin to the visible points.
Write a program which, given a value for the size, N, computes the number of visible points (x, y) with 0 ≤ x, y ≤ N.
Input
The first line of input contains a single integer C (1 ≤ C ≤ 1000) which is the number of datasets that follow.
Each dataset consists of a single line of input containing a single integer N (1 ≤ N ≤ 1000), which is the size.
Output
For each dataset, there is to be one line of output consisting of: the dataset number starting at 1, a single space, the size, a single space and the number of visible points for that size.
Sample Input
4
2
4
5
231
Sample Output
1 2 5
2 4 13
3 5 21
4 231 32549
思路:
问题:从原点出发的射线从x轴开始逆时针旋转,如果射线穿过某点则这个点 则该点可以被看到 求可以看到的点的个数总和
知道这个题是有规律(找到斜率相同且最先出现的点)直接看 看了好久也没找到,最后自己索性把所有要被与原点相连接的点打印出来 就可以看出来了
输出如图:
三个值分别表示:
x y k

规律:如果x是奇数(例如x=7) 需要满足gcd(x,y)==1的点 若是偶数同理
即:x与y互质 (佩服同学能直接看出来互质……)
下面是找规律的代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAX=1e6;
struct node{
double count2;
LL x;
LL y;
}num[MAX+5];
struct node1{
LL x1;
LL y1;
double num3;
}edge[MAX+5];
bool cmp(node a,node b)
{
if(a.count2==b.count2){
return a.x<b.x;
}
else{
return a.count2<b.count2;
}
}
bool cmp1(node1 a,node1 b)
{
if(a.x1!=b.x1){
return a.x1<b.x1;
}
return a.y1<b.y1;
}
int main()
{
LL count,T,n;
scanf("%lld",&T);
for(LL k=1;k<=T;k++){
scanf("%lld",&n);
count=0;
for(LL i=2;i<=n;i++){
for(LL j=1;j<i;j++){
num[count].count2=(j*1.0)/(i*1.0);
num[count].x=i;
num[count].y=j;
count++;
}
}
sort(num,num+count,cmp);
LL count1=0,count3=0;
for(LL i=0;i<count;i++){
if(num[i].count2!=num[i-1].count2){
edge[count3].x1=num[i].x;
edge[count3].y1=num[i].y;
edge[count3++].num3=num[i].count2;
// printf("*%lld %lld %.2lf\n",num[i].x,num[i].y,num[i].count2);
count1++;
}
}
sort(edge,edge+count3,cmp1);
for(int i=0;i<count3;i++){
printf("*%lld %lld %.2lf\n",edge[i].x1,edge[i].y1,edge[i].num3);
}
if(n==1){
printf("%lld 1 3\n",k);
}
else{
LL sum=3;
sum+=count1*2;
printf("%lld %lld %lld\n",k,n,sum);
}
}
return 0;
}
AC代码:
(找规律接近100行 但AC却只是40行左右)
#include<stdio.h>
typedef long long LL;
const int MAX=1e5;
int gcd(int a,int b)
{
if(b==0){
return a;
}
return gcd(b,a%b);
}
int main()
{
LL num[MAX+5]={0},T;
num[1]=1;
for(int i=2;i<=1000;i++){
LL count=0;
if(i%2==0){
for(int j=1;j<i;j+=2){
if(gcd(i,j)==1){
count++;
}
}
}
else{
for(int j=1;j<i;j++){
if(gcd(i,j)==1){
count++;
}
}
}
num[i]=num[i-1]+count;
}
scanf("%lld",&T);
for(LL k=1;k<=T;k++){
LL n,sum=0;
scanf("%lld",&n);
sum+=(num[n]*2+1);
printf("%lld %lld %lld\n",k,n,sum);
}
return 0;
}
Visible Lattice Points(规律题)【数学规律】的更多相关文章
- SPOJ VLATTICE Visible Lattice Points (莫比乌斯反演基础题)
Visible Lattice Points Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at ...
- poj 3060 Visible Lattice Points
http://poj.org/problem?id=3090 Visible Lattice Points Time Limit: 1000MS Memory Limit: 65536K Tota ...
- SPOJ 7001. Visible Lattice Points (莫比乌斯反演)
7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N lattice. One corner is at (0,0, ...
- spoj 7001. Visible Lattice Points GCD问题 莫比乌斯反演
SPOJ Problem Set (classical) 7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N la ...
- Visible Lattice Points (莫比乌斯反演)
Visible Lattice Points 题意 : 从(0,0,0)出发在(N,N,N)范围内有多少条不从重合的直线:我们只要求gcd(x,y,z) = 1; 的点有多少个就可以了: 比如 : 点 ...
- spoj 7001 Visible Lattice Points莫比乌斯反演
Visible Lattice Points Time Limit:7000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ...
- 数论 - 欧拉函数的运用 --- poj 3090 : Visible Lattice Points
Visible Lattice Points Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5636 Accepted: ...
- Spoj 7001 Visible Lattice Points 莫比乌斯,分块
题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37193 Visible Lattice Points Time L ...
- P8 Visible Lattice Points
P8 Visible Lattice Points Time Limit:1000ms, Memory Limit:65536KB Description A lattice point (x ...
随机推荐
- 依赖工程开发,编译报错Command Libtool failed with a nonzero exit code
升级AFN之后,SDK工程始终编译不通过找不到SDK.a 原因在SDK Target ->Build phases ->Link Binary With Libraries 多添加了SDK ...
- tableView的嵌套
1,subTableView需要开启多手势识别,多层tableView都会响应滚动事件(如果底层是scroll 依然会响应,这样滚动tableview时,scroll也会滚动,导致滚动过于灵活)2,通 ...
- PAT-1058 A+B in Hogwarts (进制转换)
1058. A+B in Hogwarts If you are a fan of Harry Potter, you would know the world of magic has its ow ...
- 【常用工具】vagrant的box哪里下?镜像在哪儿找?教你在vagrant官网下载各种最新.box资源
进入vagrant官网 : https://www.vagrantup.com/ 点击findbox[寻找box],进入有很多box的列表 : https://app.vagrantup.com/bo ...
- Python可变对象和不可变对象
Python中一切皆对象,每个对象都有其唯一的id,对应的类型和值,其中id指的是对象在内存中的位置.根据对象的值是否可修改分为可变对象和不可变对象.其中, 不可对象包括:数字,字符串,tuple 可 ...
- SQL——处理列中NULL值
处理NULL值 - 数据库中某列为NULL值,使用函数在列值为NULL时返回固定值. SQLServer:ISNULL(col,value) 示例:SELECT ISNULL(co ...
- 转 vue过滤器使用
简单介绍一下过滤器,顾名思义,过滤就是一个数据经过了这个过滤之后出来另一样东西,可以是从中取得你想要的,或者给那个数据添加点什么装饰,那么过滤器则是过滤的工具.例如,从['abc','abd','ad ...
- 使用EditPlus根据指定字符批量换行,快速填充Postman请求参数键值对
1.当某个.ext格式的文件中的重复格式内容太多时,而又想要根据某个字符进行批量换行时,那么可以使用EditPlus进行批量换行. 在开发过程中就会经常遇到这种问题,比如把Url的请求参数,快速的填写 ...
- Kubernetes学习笔记(六):使用ConfigMap和Secret配置应用程序
概述 本文的核心是:如何处理应用程序的数据配置. 配置应用程序可以使用以下几种途径: 向容器传递命令行参数 为每个容器配置环境变量 通过特殊的卷将配置文件挂载到容器中 向容器传递命令行参数 在Kube ...
- liunx tar 详解
tar [-cxtzjvfpPN] 文件与目录 .... 参数说明 -c: 建立一个压缩文件的指令参数 (crate的缩写): -x:解开一个压缩文件的参数指令: -t:查看tarfile里面的文件 ...