题解 UVA11549 【Calculator Conundrum】

Solution 计算器谜题

题目大意:每次平方并取前\(n\)位数字,问出现的所有数的最大值

分析:这题是从蓝书上看到的,学到了一个叫做\(Floyd\)判圈算法的神仙玩意儿.

简而言之,这个算法就是维护两个指针\(k1\),\(k2\),然后每次依题意让\(k1\)\(1\)步,\(k2\)\(2\)步,如果有环的话,那么\(k1\),\(k2\)一定会相遇(可以想象成追击问题,怎么又是小学奥数)

最后在\(k2\)取的所有值里面取最大值即可

#include <cstdio>
using namespace std;
typedef long long ll;
unsigned char tmp[32];
int t,n,k;
inline int nxt(int x){
    ll res = 0,t = (ll)x * x;
    int p = 0;
    do{
        tmp[++p] = t % 10;
        t /= 10;
    }while(t);
    for(int i = p;i >= p - n + 1 && i >= 1;i--)res = res * 10 + tmp[i];
    return res;
}
inline void solve(){
    scanf("%d %d",&n,&k);
    int ans = k,k1 = k,k2 = k;
    do{
        k1 = nxt(k1);
        k2 = nxt(k2);if(k2 > ans)ans = k2;
        k2 = nxt(k2);if(k2 > ans)ans = k2;
    }while(k1 != k2);
    printf("%d\n",ans);
}
int main(){
    scanf("%d",&t);
    while(t--)solve();
    return 0;
}

转载于:https://www.cnblogs.com/colazcy/p/11544871.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值