记录编号 125527 评测结果 AAAAAAAAAAAAAA
题目名称 [暑假培训2012] 残酷的数学老师 最终得分 100
用户昵称 Gravatardevil 是否通过 通过
代码语言 C++ 运行时间 0.067 s
提交时间 2014-10-08 23:04:06 内存使用 0.31 MiB
显示代码纯文本
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

typedef unsigned long long LL;
LL n,m;
const int MAX=10010;
struct hp
{
    LL num[MAX];
    hp() {memset(num,0,sizeof(num));num[0]=1;}
    void print()
    {
        printf("%llu",num[num[0]]);int k=10,t=1;
        while(num[num[0]]/k!=0) k*=10,t++;
        for(int i=num[0]-1;i>0;i--)
        {
            if(t+4>=70)
            {
                char s[10];
                sprintf(s,"%.4llu",num[i]);
                for(int i=0;i<70-t;i++) printf("%c",s[i]);
                printf("\n");
                for(int j=70-t;j<=3;j++) printf("%c",s[j]);
                t=t-65;
            }
            else printf("%.4llu",num[i]),t+=5;
        }
    }
};

hp operator * (hp a, LL b)
{
    int len=2*a.num[0];int i;
    for(i=1;i<=len;i++) a.num[i]*=b;
    for(i=1;i<=len;i++)
    {
        if(a.num[i]>=10000)
        {
            a.num[i+1]+=a.num[i]/10000;
            a.num[i]%=10000;
        }
    }
    while(a.num[a.num[0]]==0&&a.num[0]>1) a.num[0]--;
    while(a.num[a.num[0]+1]>0) a.num[0]++;
    return a;
}

hp operator * (hp a,hp b)
{
    hp c;c.num[0]=a.num[0]+b.num[0];
    for(int i=1;i<=a.num[0];i++)
    {
        for(int j=1;j<=b.num[0];j++)
        {
            c.num[i+j-1]+=a.num[i]*b.num[j];
        }
    }
    for(int i=1;i<=c.num[0];i++)
    {
        if(c.num[i]>=10000)
        {
            c.num[i+1]+=c.num[i]/10000;
            c.num[i]%=10000;
        }
    }
    while(c.num[c.num[0]]==0&&c.num[0]>1) c.num[0]--;
    return c;
}

hp power(LL a,LL b)
{
    if(b==0) {hp t;t.num[1]=1;return t;}
    if(b==1)
    {
        hp t;int len=1,k=1;
        while(a>0)
        {
            if(k>=10000) {k=1;len++;}
            t.num[len]+=k*(a%10);
            k*=10;a/=10;
        }
        t.num[0]=len;
        return t;
    }
    hp t=power(a,b/2);
    t=t*t;
    if(b%2==1) t=t*a;
    return t;
}

int main()
{
    freopen("cruel1.in","r",stdin);
    freopen("cruel1.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    hp c=power(n,m);
    c.print();
    return 0;
}