取后500位
struct node
{
int n[516],l;
};
node mul(node &a,node &b)
{
node c;
memset(c.n,0,sizeof(c.n));
for(int i=1;i<=b.l;++i)
for(int j=1;j<=a.l;++j)
{
if(i+j-1>500)
break;
c.n[i+j-1]+=a.n[j]*b.n[i];
}
c.l=min(a.l+b.l-1,500);
for(int i=1;i<=c.l;++i)
{
c.n[i+1]+=c.n[i]/10;
c.n[i]%=10;
}
while(c.l<=500&&c.n[c.l+1])
{
c.l++;
c.n[c.l+1]+=c.n[c.l]/10;
c.n[c.l]%=10;
}
return c;
}
node Pow(int y)
{
node b,a;
memset(b.n,0,sizeof(b.n));
memset(a.n,0,sizeof(a.n));
b.l=1;b.n[1]=1;
a.l=1;a.n[1]=2;
while(y)
{
if(y&1)
b=mul(b,a);
a=mul(a,a);
y>>=1;
}
return b;
}