UVa 11549 计算器谜题(Floyd判圈算法)
2024-08-23 01:53:11
https://vjudge.net/problem/UVA-11549
题意:
有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位。如果一直这样做下去,能得到的最大数是多少?
思路:
这个肯定是会循环的。
比较普通的做法就是用set来判断是否出现过来终止循环。
另一个高效算法:Floyd判圈算法!!
想象一下,假设有两个小孩子在一个“可以无限向前跑”的跑道上赛跑,同时出发,但其中一个孩子的速度是另一个两倍。如果跑到是直的,跑得快的小孩永远在前面,但如果跑道有环,则跑得快的小孩将“追上”跑得慢的小孩。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std; int n,k; int next(int n,int k)
{
int buf[];
if(!k) return ;
int cnt=;
long long k2=(long long)k*k;
while(k2) {buf[cnt++]=k2%;k2/=;}
if(n>cnt) n=cnt;
int ans=;
for(int i=;i<n;i++)
ans=ans*+buf[--cnt];
return ans;
} int main()
{
//freopen("D:\\input.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
int ans=k;
int k1=k,k2=k;
do
{
k1=next(n,k1); ans=max(ans,k1);
k2=next(n,k2); ans=max(ans,k2); //小孩2,第一步
k2=next(n,k2); ans=max(ans,k2); //小孩2,第二步
}while(k1!=k2); //追上以后才停止
printf("%d\n",ans);
}
return ;
}
最新文章
- 微软How old do I Look——初体验
- Linux vim(4)
- SQL存储过程、视图
- windows 系统下 Firefox hostadmin插件无法修改Host
- Extjs4 获取到前一天的日期
- jquery获取当前时间
- wp8.1 C#技巧: 计时器
- 【linux】rpm常见命令
- 非常详细的 Docker 学习笔记
- SQL 把查出来的信息整合为一张表
- 重拾C,一天一点点_4_随想
- hdu 4720 计算几何简单题
- WPF 自定义路由事件
- 接口中的成员变量必须是static
- iOS-网络编程(二)文件上传和断点离线下载
- Oracle错误ORA-03113: end-of-file on communication channel处理办法
- iOS开发 - Swift使用GCD实现计时器功能
- WAF开放规则定义权:专家策略+用户自定义策略=Web安全
- 【Java并发.5】基础构建模块
- 面向对象【林老师版】:__init__定制自己独有的特征(三)