#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define PI 3.1415926535897932384626433832795
#define base 10000
#define K 23
#define N (1<<K)
void LMULT3(short a[],short b[],short c[],int k,double d[],double e[],double f[],long long t[]);
void LSQUARE(short a[],short c[],int k,double d[],double f[],long long t[]);
void SUBn(short a[],short b[],short c[],int n);
int main(void){
clock_t start,end;
static short a[N],b[N],c[N];
static long long t[N];
static double d[N],e[N],f[N];
int i,k,x,y;
double r;
a[0]=1;
b[0]=x%base;
b[1]=x/base;
c[0]=1;
i=1;
while(1){
if(y&1)LMULT3(a,b,a,k,d,e,f,t);
y>>=1;
if(!y)break;
LSQUARE(b,b,k,d,e,t);
i*=2;
}
if(!k)k++;
SUBn(a,c,a,k);
printf("%.3fs\n",(double)(end
-start
)/CLOCKS_PER_SEC
); for(i
=4;i
--;)printf("%04d",a
[i
]); return 0;
}
void SUBn(short a[],short b[],short c[],int n){
int i;
int t=0;
for(i=0;i<n;i++){
t+=a[i]-b[i]+base;
c[i]=t%base;
t/=base;
t--;
}
return;
}
int tib(int a,int k){
int i=k,z=0;
while(i--){
z=(z<<1)+(a&1);
a>>=1;
}
return z;
}
void INV2(double d[],short c[],int k,long long t[]){
int i,k2=1<<k;
for(i=(1<<k)/2;i--;)d[1+i*2]*=-1;
for(i=0;i<k2;i++)t[i]=(long long)(d[i]/(k2/2)+0.5);
for(i=0;i<k2;i++){
c[i]=t[i]%base;
t[i+1]+=t[i]/base;
}
return;
}
void FFT(double d[],int k){
int i,j,k5,k2=1<<k,cnt;
double t[2],r,pr;
for(i=0;i<k2*2;i+=4){
t[0]=d[i+2];
t[1]=d[i+3];
d[i+2]=d[i+0]-t[0];
d[i+3]=d[i+1]-t[1];
d[i+0]+=t[0];
d[i+1]+=t[1];
}
for(i=0;i<k2*2;i+=8){
t[0]=d[i+4];
t[1]=d[i+5];
d[i+4]=d[i+0]-t[0];
d[i+5]=d[i+1]-t[1];
d[i+0]+=t[0];
d[i+1]+=t[1];
t[0]= +d[i+7];
t[1]=-d[i+6] ;
d[i+6]=d[i+2]-t[0];
d[i+7]=d[i+3]-t[1];
d[i+2]+=t[0];
d[i+3]+=t[1];
}
for(j=2;j<k;j++){
k5=1<<j;
pr=PI/k5;
for(i=0;i<k2;i+=k5){
for(cnt=0;cnt<k5;cnt++){
r=pr*cnt;
t
[0]= cos(r
)*d
[0+(i
+k5
)*2]+sin(r
)*d
[1+(i
+k5
)*2]; t
[1]=-sin(r
)*d
[0+(i
+k5
)*2]+cos(r
)*d
[1+(i
+k5
)*2]; d[0+(i+k5)*2]=d[0+i*2]-t[0];
d[1+(i+k5)*2]=d[1+i*2]-t[1];
d[0+i*2]+=t[0];
d[1+i*2]+=t[1];
i++;
}
}
}
return;
}
void PRE2(short a[],double d[],int k){
int i,j;
for(i=0;i<(1<<k)*2;i++){
j=tib(i,k);
d[0+i*2]=(double)a[0+j*2];
d[1+i*2]=(double)a[1+j*2];
}
return;
}
void MID3(double d[],double e[],double f[],int k){
int i,j,k2;
double s[4],t[2],u[2],r,pr;
k2=1<<k;
f[0+0*2]=d[0+0*2]*e[0+0*2]+d[1+0*2]*e[1+0*2];
f[1+0*2]=d[0+0*2]*e[1+0*2]+d[1+0*2]*e[0+0*2];
pr=-PI/(k2/4);
for(i=1,j=k2/2-1;i<k2/4;i++,j--){
r=i*pr;
s[0]=d[0+i*2]-d[0+j*2];
s[1]=d[1+i*2]+d[1+j*2];
s[2]=e[0+i*2]-e[0+j*2];
s[3]=e[1+i*2]+e[1+j*2];
t[0]=-s[0]*s[3]-s[1]*s[2];
t[1]=+s[0]*s[2]-s[1]*s[3];
f[0+i*2]=-0.25*(+t[0]*u[1]+t[1]*u[0])+d[0+i*2]*e[0+i*2]-d[1+i*2]*e[1+i*2];
f[1+i*2]=+0.25*(-t[1]*u[1]+t[0]*u[0])+d[0+i*2]*e[1+i*2]+d[1+i*2]*e[0+i*2];
f[0+j*2]=-0.25*(+t[0]*u[1]+t[1]*u[0])+d[0+j*2]*e[0+j*2]-d[1+j*2]*e[1+j*2];
f[1+j*2]=-0.25*(-t[1]*u[1]+t[0]*u[0])+d[0+j*2]*e[1+j*2]+d[1+j*2]*e[0+j*2];
}
f[0+k2/2]=d[0+k2/2]*e[0+k2/2]-d[1+k2/2]*e[1+k2/2];
f[1+k2/2]=(d[0+k2/2]*e[1+k2/2]+d[1+k2/2]*e[0+k2/2]);
for(i=0;i<k2/2;i++){
j=tib(i,k-1);
d[0+j*2]=f[0+i*2];
d[1+j*2]=-f[1+i*2];
}
return;
}
void LMULT3(short a[],short b[],short c[],int k,double d[],double e[],double f[],long long t[]){
if(k<3)k=3;
PRE2(a,d,k-1);
FFT(d,k-1);
PRE2(b,e,k-1);
FFT(e,k-1);
MID3(d,e,f,k);
FFT(d,k-1);
INV2(d,c,k,t);
return;
}
void LSQUARE(short a[],short c[],int k,double d[],double f[],long long t[]){
if(k<3)k=3;
PRE2(a,d,k-1);
FFT(d,k-1);
MID3(d,d,f,k);
FFT(d,k-1);
INV2(d,c,k,t);
return;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUKI2RlZmluZSBiYXNlIDEwMDAwCiNkZWZpbmUgSyAyMwojZGVmaW5lIE4gKDE8PEspCnZvaWQgTE1VTFQzKHNob3J0IGFbXSxzaG9ydCBiW10sc2hvcnQgY1tdLGludCBrLGRvdWJsZSBkW10sZG91YmxlIGVbXSxkb3VibGUgZltdLGxvbmcgbG9uZyB0W10pOwp2b2lkIExTUVVBUkUoc2hvcnQgYVtdLHNob3J0IGNbXSxpbnQgayxkb3VibGUgZFtdLGRvdWJsZSBmW10sbG9uZyBsb25nIHRbXSk7CnZvaWQgU1VCbihzaG9ydCBhW10sc2hvcnQgYltdLHNob3J0IGNbXSxpbnQgbik7CgppbnQgbWFpbih2b2lkKXsKICAgIGNsb2NrX3Qgc3RhcnQsZW5kOwoJc3RhdGljIHNob3J0IGFbTl0sYltOXSxjW05dOwoJc3RhdGljIGxvbmcgbG9uZyB0W05dOwoJc3RhdGljIGRvdWJsZSBkW05dLGVbTl0sZltOXTsKCWludCBpLGsseCx5OwoJZG91YmxlIHI7CglwcmludGYoInheeeOBruW9ouOBp+WFpeWKm1xuIik7CglzY2FuZigiJWReJWQiLCZ4LCZ5KTsKCXN0YXJ0PWNsb2NrKCk7CglyPWxvZzEwKHgpOwoJaz0oaW50KWNlaWwobG9nMihjZWlsKDIqci80KSkpOwoJYVswXT0xOwoJYlswXT14JWJhc2U7CgliWzFdPXgvYmFzZTsKCWNbMF09MTsKCWk9MTsKCXdoaWxlKDEpewoJCWlmKHkmMSlMTVVMVDMoYSxiLGEsayxkLGUsZix0KTsKCQl5Pj49MTsKCQlpZigheSlicmVhazsKCQlMU1FVQVJFKGIsYixrLGQsZSx0KTsKCQlpKj0yOwoJCWs9KGludCljZWlsKGxvZzIoY2VpbCgyKmkqci80KSkpOwoJfQoJaWYoIWspaysrOwoJU1VCbihhLGMsYSxrKTsKCWVuZD1jbG9jaygpOwoJcHJpbnRmKCIlLjNmc1xuIiwoZG91YmxlKShlbmQtc3RhcnQpL0NMT0NLU19QRVJfU0VDKTsKCWZvcihpPTQ7aS0tOylwcmludGYoIiUwNGQiLGFbaV0pOwoJcmV0dXJuIDA7Cn0KCnZvaWQgU1VCbihzaG9ydCBhW10sc2hvcnQgYltdLHNob3J0IGNbXSxpbnQgbil7CglpbnQgaTsKCWludCB0PTA7Cglmb3IoaT0wO2k8bjtpKyspewoJCXQrPWFbaV0tYltpXStiYXNlOwoJCWNbaV09dCViYXNlOwoJCXQvPWJhc2U7CgkJdC0tOwoJfQoJcmV0dXJuOwp9CgppbnQgdGliKGludCBhLGludCBrKXsKCWludCBpPWssej0wOwoJd2hpbGUoaS0tKXsKCQl6PSh6PDwxKSsoYSYxKTsKCQlhPj49MTsKCX0KCXJldHVybiB6Owp9Cgp2b2lkIElOVjIoZG91YmxlIGRbXSxzaG9ydCBjW10saW50IGssbG9uZyBsb25nIHRbXSl7CglpbnQgaSxrMj0xPDxrOwoJZm9yKGk9KDE8PGspLzI7aS0tOylkWzEraSoyXSo9LTE7Cglmb3IoaT0wO2k8azI7aSsrKXRbaV09KGxvbmcgbG9uZykoZFtpXS8oazIvMikrMC41KTsKCWZvcihpPTA7aTxrMjtpKyspewoJCWNbaV09dFtpXSViYXNlOwoJCXRbaSsxXSs9dFtpXS9iYXNlOwoJfQoJcmV0dXJuOwp9Cgp2b2lkIEZGVChkb3VibGUgZFtdLGludCBrKXsKCWludCBpLGosazUsazI9MTw8ayxjbnQ7Cglkb3VibGUgdFsyXSxyLHByOwoJZm9yKGk9MDtpPGsyKjI7aSs9NCl7CgkJdFswXT1kW2krMl07CgkJdFsxXT1kW2krM107CgkJZFtpKzJdPWRbaSswXS10WzBdOwoJCWRbaSszXT1kW2krMV0tdFsxXTsKCQlkW2krMF0rPXRbMF07CgkJZFtpKzFdKz10WzFdOwoJfQoJZm9yKGk9MDtpPGsyKjI7aSs9OCl7CgkJdFswXT1kW2krNF07CgkJdFsxXT1kW2krNV07CgkJZFtpKzRdPWRbaSswXS10WzBdOwoJCWRbaSs1XT1kW2krMV0tdFsxXTsKCQlkW2krMF0rPXRbMF07CgkJZFtpKzFdKz10WzFdOwoJCXRbMF09ICAgICAgICtkW2krN107CgkJdFsxXT0tZFtpKzZdICAgICAgIDsKCQlkW2krNl09ZFtpKzJdLXRbMF07CgkJZFtpKzddPWRbaSszXS10WzFdOwoJCWRbaSsyXSs9dFswXTsKCQlkW2krM10rPXRbMV07Cgl9Cglmb3Ioaj0yO2o8aztqKyspewoJCWs1PTE8PGo7CgkJcHI9UEkvazU7CgkJZm9yKGk9MDtpPGsyO2krPWs1KXsKCQkJZm9yKGNudD0wO2NudDxrNTtjbnQrKyl7CgkJCQlyPXByKmNudDsKCQkJCXRbMF09IGNvcyhyKSpkWzArKGkrazUpKjJdK3NpbihyKSpkWzErKGkrazUpKjJdOwoJCQkJdFsxXT0tc2luKHIpKmRbMCsoaStrNSkqMl0rY29zKHIpKmRbMSsoaStrNSkqMl07CgkJCQlkWzArKGkrazUpKjJdPWRbMCtpKjJdLXRbMF07CgkJCQlkWzErKGkrazUpKjJdPWRbMStpKjJdLXRbMV07CgkJCQlkWzAraSoyXSs9dFswXTsKCQkJCWRbMStpKjJdKz10WzFdOwoJCQkJaSsrOwoJCQl9CgkJfQoJfQoJcmV0dXJuOwp9Cgp2b2lkIFBSRTIoc2hvcnQgYVtdLGRvdWJsZSBkW10saW50IGspewoJaW50IGksajsKCWZvcihpPTA7aTwoMTw8aykqMjtpKyspewoJCWo9dGliKGksayk7CgkJZFswK2kqMl09KGRvdWJsZSlhWzAraioyXTsKCQlkWzEraSoyXT0oZG91YmxlKWFbMStqKjJdOwoJfQoJcmV0dXJuOwp9Cgp2b2lkIE1JRDMoZG91YmxlIGRbXSxkb3VibGUgZVtdLGRvdWJsZSBmW10saW50IGspewoJaW50IGksaixrMjsKCWRvdWJsZSBzWzRdLHRbMl0sdVsyXSxyLHByOwoJazI9MTw8azsKCWZbMCswKjJdPWRbMCswKjJdKmVbMCswKjJdK2RbMSswKjJdKmVbMSswKjJdOwoJZlsxKzAqMl09ZFswKzAqMl0qZVsxKzAqMl0rZFsxKzAqMl0qZVswKzAqMl07Cglwcj0tUEkvKGsyLzQpOwoJZm9yKGk9MSxqPWsyLzItMTtpPGsyLzQ7aSsrLGotLSl7CgkJcj1pKnByOwoJCXVbMF09Y29zKHIpKzE7CgkJdVsxXT1zaW4ocik7CgkJc1swXT1kWzAraSoyXS1kWzAraioyXTsKCQlzWzFdPWRbMStpKjJdK2RbMStqKjJdOwoJCXNbMl09ZVswK2kqMl0tZVswK2oqMl07CgkJc1szXT1lWzEraSoyXStlWzEraioyXTsKCQl0WzBdPS1zWzBdKnNbM10tc1sxXSpzWzJdOwoJCXRbMV09K3NbMF0qc1syXS1zWzFdKnNbM107CgkJZlswK2kqMl09LTAuMjUqKCt0WzBdKnVbMV0rdFsxXSp1WzBdKStkWzAraSoyXSplWzAraSoyXS1kWzEraSoyXSplWzEraSoyXTsKCQlmWzEraSoyXT0rMC4yNSooLXRbMV0qdVsxXSt0WzBdKnVbMF0pK2RbMCtpKjJdKmVbMStpKjJdK2RbMStpKjJdKmVbMCtpKjJdOwoJCWZbMCtqKjJdPS0wLjI1KigrdFswXSp1WzFdK3RbMV0qdVswXSkrZFswK2oqMl0qZVswK2oqMl0tZFsxK2oqMl0qZVsxK2oqMl07CgkJZlsxK2oqMl09LTAuMjUqKC10WzFdKnVbMV0rdFswXSp1WzBdKStkWzAraioyXSplWzEraioyXStkWzEraioyXSplWzAraioyXTsKCX0KCWZbMCtrMi8yXT1kWzArazIvMl0qZVswK2syLzJdLWRbMStrMi8yXSplWzErazIvMl07CglmWzErazIvMl09KGRbMCtrMi8yXSplWzErazIvMl0rZFsxK2syLzJdKmVbMCtrMi8yXSk7Cglmb3IoaT0wO2k8azIvMjtpKyspewoJCWo9dGliKGksay0xKTsKCQlkWzAraioyXT1mWzAraSoyXTsKCQlkWzEraioyXT0tZlsxK2kqMl07Cgl9CglyZXR1cm47Cn0KCnZvaWQgTE1VTFQzKHNob3J0IGFbXSxzaG9ydCBiW10sc2hvcnQgY1tdLGludCBrLGRvdWJsZSBkW10sZG91YmxlIGVbXSxkb3VibGUgZltdLGxvbmcgbG9uZyB0W10pewoJaWYoazwzKWs9MzsKCVBSRTIoYSxkLGstMSk7CglGRlQoZCxrLTEpOwoJUFJFMihiLGUsay0xKTsKCUZGVChlLGstMSk7CglNSUQzKGQsZSxmLGspOwoJRkZUKGQsay0xKTsKCUlOVjIoZCxjLGssdCk7CglyZXR1cm47Cn0KCnZvaWQgTFNRVUFSRShzaG9ydCBhW10sc2hvcnQgY1tdLGludCBrLGRvdWJsZSBkW10sZG91YmxlIGZbXSxsb25nIGxvbmcgdFtdKXsKCWlmKGs8MylrPTM7CglQUkUyKGEsZCxrLTEpOwoJRkZUKGQsay0xKTsKCU1JRDMoZCxkLGYsayk7CglGRlQoZCxrLTEpOwoJSU5WMihkLGMsayx0KTsKCXJldHVybjsKfQ==