UVA11549 Calculator Conundrum

链接

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2544

题解1

肯定有循环节啊,要不然还做个毛
直接暴力模拟 500000 500000 次,统计最大值

题解2

刘汝佳的题解竟然用 string s t r i n g 判重,我也是醉了
他补充的一个算法很好, floyd f l o y d 判环,用两条线路,一条线路每次模拟两次计算,另一条线路每次模拟一次计算,当 k1=k2 k 1 = k 2 时,说明找到了循环节,这样为啥对呢?如何确保 k2 k 2 不会直接跳过 k1 k 1 ?
k1 k 1 走了 x x

1+2x(1+x)=kn

x=kn x = k n

所以没问题
显然时间复杂度复杂度就是 O( O ( 循环节长度 ) ) <script type="math/tex" id="MathJax-Element-12">)</script>
刘汝佳也没有证明循环节长度的大小,我也不会,有谁会吗?请在评论区留言

代码1

#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
int main()
{
    ll n, k, mi, i, T, m;
    for(scanf("%lld",&T);T;T--)
    {
        scanf("%lld%lld",&n,&k);
        for(i=mi=1;i<=n;i++)mi*=10;
        m=k;
        for(i=1;i<=500000;i++)
        {
            for(k*=k;k>=mi;k/=10);
            m=max(m,k);
        }
        printf("%lld\n",m);
    }
    return 0;
}

代码2

#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
ll mi, m;
ll step(ll k)
{
    ll i;
    for(k*=k;k>=mi;k/=10);
    m=max(m,k);
    return k;
}
int main()
{
    ll n, k1, i, T, k2, k;
    for(scanf("%lld",&T);T;T--)
    {
        scanf("%lld%lld",&n,&k);
        for(i=mi=1;i<=n;i++)mi*=10;
        for(m=k1=k,k2=step(step(k));k1^k2;k1=step(k1), k2=step(step(k2)));
        printf("%lld\n",m);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值