[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]);
    }
}

 

posted @ 2021-01-25 17:07  hfctf0210  阅读(317)  评论(0编辑  收藏  举报