news 2026/6/15 22:01:53

UVa 493 Rational Spiral

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 493 Rational Spiral

题目描述

题目要求按顺时针螺旋顺序遍历平面上的整数点(xxx表示分母,yyy表示分子),跳过分母为零的点(x=0x = 0x=0),并且跳过约分后与之前重复的有理数。输出指定序号的有理数(序号从000开始)。输出格式为分子 / 分母,且分母必须为正,符号在分子上。

输入格式

输入包含多个整数,每行一个,表示需要输出的有理数的序号。输入以文件结束符(EOF\texttt{EOF}EOF)终止。

输出格式

对于每个输入的序号,输出一行,格式为分子 / 分母

样例

输入

0 1 2 3 10

输出

1 / 1 0 / 1 -1 / 1 -2 / 1 3 / 2

题目分析

本题的核心是模拟顺时针螺旋遍历整数网格,并收集不重复的有理数。

螺旋遍历

从原点(0,0)(0,0)(0,0)开始,顺时针螺旋向外移动。步长序列为:1,1,2,2,3,3,4,4,…1,1,2,2,3,3,4,4,\ldots1,1,2,2,3,3,4,4,。方向顺序为:右、下、左、上、右、…(顺时针)。

跳过规则

  • 跳过x=0x = 0x=0的点(分母为零)。
  • 跳过约分后与之前出现过的有理数重复的点。例如(4,2)(4,2)(4,2)约分为(2,1)(2,1)(2,1),若(2,1)(2,1)(2,1)之前已出现,则跳过。
  • 跳过(0,0)(0,0)(0,0)点(不是有理数)。

有理数标准化

为方便去重,将每个有理数标准化为分母为正的最简形式:

  • 分子分母同取绝对值,用最大公约数约分。
  • 若分子为负,则整体符号放在分子上,分母保持为正。

使用一个集合存储已出现的有理数,用编码分子 * 100000 + 分母分子 * 100000 + 分母作为唯一标识(注意正负号单独处理)。

生成过程

  • 初始化:第000个有理数为(1,1)(1,1)(1,1),第111个有理数为(0,1)(0,1)(0,1)(注意原点(0,0)(0,0)(0,0)被跳过,(0,1)(0,1)(0,1)对应0/10/10/1)。
  • 然后继续螺旋遍历,收集后续有理数,直到达到所需的最大序号。

复杂度分析

需要生成到最大序号对应的有理数,序号可能较大,但生成速度足够。

代码实现

// Rational Spiral// UVa ID: 493// Verdict: Accepted// Submission Date: 2016-07-29// UVa Run Time: 0.580s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);vector<pair<int,int>>offset={{0,1},{1,0},{0,-1},{-1,0}};set<longlong>produced={100001,1};map<int,pair<int,int>>rational={{0,{1,1}},{1,{0,1}}};intnumber,max_number=0;vector<int>numbers;while(cin>>number){numbers.push_back(number);max_number=max(max_number,number);}intdirection=0,counter=2,startx=0,starty=0;queue<int>step;step.push(1),step.push(1);while(counter<=max_number){intlengthOfStep=step.front();step.pop();for(inti=1;i<=lengthOfStep;i++){startx+=offset[direction].first;starty+=offset[direction].second;if(startx==0||starty==0)continue;intsign=1;if(starty<0)sign*=-1;if(startx<0)sign*=-1;intnexty=abs(starty),nextx=abs(startx);inta=nexty,b=nextx,t;while(a%b)t=a,a=b,b=t%b;if(b>0)nexty/=b,nextx/=b;if(produced.find(sign*(nexty*100000+nextx))==produced.end()){produced.insert(sign*(nexty*100000+nextx));rational[counter]=make_pair(sign*nexty,nextx);counter++;}}direction+=1;direction%=4;step.push(lengthOfStep+1);}for(autoaNumber:numbers){pair<int,int>resutl=rational[aNumber];cout<<resutl.first<<" / "<<resutl.second<<'\n';}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 21:54:57

marked.js安全防护架构深度解析:构建企业级输入验证机制

marked.js安全防护架构深度解析&#xff1a;构建企业级输入验证机制 【免费下载链接】marked A markdown parser and compiler. Built for speed. 项目地址: https://gitcode.com/gh_mirrors/ma/marked 在现代Web应用开发中&#xff0c;marked.js作为高性能Markdown解析…

作者头像 李华
网站建设 2026/6/15 21:52:54

如何减少 RAG 系统的幻觉问题?有哪些实用方法?

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:AI大模型原理和应用面试题 文章目录 一、🍀回答重点 二、🍀方法和策略 2.1 ☘️检索阶段防幻觉策略 2.2 ☘️生成阶段防幻觉技术 2.3 ☘️后处理验证方…

作者头像 李华
网站建设 2026/6/15 21:49:18

计算机毕业设计之乡村低碳出行与振兴智能协同平台设计与实现

随着乡村振兴战略的深入推进&#xff0c;数字化技术在乡村发展中的应用愈发关键&#xff0c;构建乡村低碳出行与产业协同发展平台成为重要课题。本设计旨在基于 Vue 和 Spring Boot 框架&#xff0c;打造乡村低碳出行与振兴智能协同平台&#xff0c;为乡村可持续发展提供创新解…

作者头像 李华
网站建设 2026/6/15 21:43:59

微信小程序图片裁剪架构深度解析:we-cropper企业级实战指南

微信小程序图片裁剪架构深度解析&#xff1a;we-cropper企业级实战指南 【免费下载链接】we-cropper 微信小程序图片裁剪工具 项目地址: https://gitcode.com/gh_mirrors/we/we-cropper 微信小程序图片裁剪是移动端开发中的核心需求&#xff0c;而we-cropper作为一款专业…

作者头像 李华
网站建设 2026/6/15 21:42:03

KS-Downloader:如何高效获取快手原始视频素材进行二次创作?

KS-Downloader&#xff1a;如何高效获取快手原始视频素材进行二次创作&#xff1f; 【免费下载链接】KS-Downloader 快手&#xff08;KuaiShou&#xff09;视频/图片下载工具&#xff1b;数据采集工具 项目地址: https://gitcode.com/gh_mirrors/ks/KS-Downloader 在内容…

作者头像 李华