• [NOIP2005普及组]循环(高精度+数学)


    此题放到提高组感觉都好难……至少以我高一结束时的水平是无法做出来的……

    思维难度十分大。

    要保证后k位答案相同,首先得保证后(k-1)位答案相同,于是先处理后(k-1)位,以此类推……于是从第一位开始这么做,最终只要比较当前位即可。若乘了10次仍不同,说明不循环,答案就是-1。

    时间复杂度O(10n^3),轻松通过本题

    #include<bits/stdc++.h>
    using namespace std;
    struct node{int a[105];}a,now,base,tmp,ans;
    int n,xh[10]={1,1,4,4,2,1,1,4,4,2};
    char str[105];
    node operator*(node a,node b)
    {
        node c;
        for(int i=0;i<n;i++)c.a[i]=0;
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        if(i+j<n)
        {
            c.a[i+j]+=a.a[i]*b.a[j];
            c.a[i+j+1]+=c.a[i+j]/10;
            c.a[i+j]%=10;
        }
        c.a[n]=0;return c;
    }
    node operator*(node a,int b)
    {
        for(int i=0;i<n;i++)a.a[i]*=b;
        for(int i=0;i<n;i++)a.a[i+1]+=a.a[i]/10,a.a[i]%=10;
        return a;
    }
    int main()
    {
        scanf("%s%d",str,&n);
        int len=strlen(str);
        for(int i=len-1;i>=max(0,len-n);i--)a.a[len-i-1]=str[i]-'0';
        ans.a[0]=xh[a.a[0]];
        base.a[0]=1,tmp=a;
        for(int i=1;i<=xh[a.a[0]];i++)base=base*tmp;
        for(int i=1;i<n;i++)
        {
            tmp=base,now=a;
            for(int j=1;j<=11;j++)
            {
                if(j==11){puts("-1");return 0;}
                now=now*tmp;
                if(a.a[i]==now.a[i]){ans=ans*j;break;}
                base=base*tmp;
            }
        }
        int flag=0;
        for(int i=102;i>=0;i--)
        {
            if(ans.a[i])flag=1;
            if(flag)printf("%d",ans.a[i]);
        }
    }
  • 相关阅读:
    JavaScript.convertArray
    JavaScript.InjectedScriptHost
    linux基础之ssh
    linux基础之常见的文件查看命令
    linux基础之ls命令
    windows安装zabbix客户端及加入监控
    centons7编译安装zabbix3.4
    gitlab备份、还原及迁移
    gitlab在centons环境下的安装及使用
    Python操作sqlserver
  • 原文地址:https://www.cnblogs.com/hfctf0210/p/14326215.html
Copyright © 2020-2023  润新知