/*
还差一点点就AC了,我还辛苦打表。。
估计这儿s=sqrt(2*pi*n)*pow((n*1.0/E),n)*(1+1.0/(12*n));
溢出了
*/
#include<iostream>
using namespace std;
#include<cmath>
#define pi 3.1415926
#define E 2.718281828459
int a[26][5]=
{
{0,0,0,0,1},{0,0,0,0,2},{0,0,0,0,6},{0,0,0,2,4},{0,0,1,2,0},
{0,0,7,2,0},{0,5,0,4,0},{4,0,3,2,0},{6,2,8,8,0},{2,8,8,0,0},
{1,6,8,0,0},{0,1,6,0,0},{2,0,8,0,0},{9,1,2,0,0},{6,8,0,0,0},
{8,8,0,0,0},{9,6,0,0,0},{2,8,0,0,0},{3,2,0,0,0},{4,0,0,0,0},
{4,0,0,0,0},{8,0,0,0,0},{4,0,0,0,0},{6,0,0,0,0}
};
int b[28][5]=
{
{1,0,0,0,0},{2,0,0,0,0},{6,0,0,0,0},{2,4,0,0,0},{1,2,0,0,0},
{7,2,0,0,0},{5,0,4,0,0},{4,0,3,2,0},{3,6,2,8,8},{3,6,2,8,8},
{3,9,9,1,6},{4,7,9,0,0},{6,2,2,7,0},{8,7,1,7,8},{1,3,0,7,6},
{2,0,9,2,2},{3,5,5,6,8},{6,4,0,2,3},{1,2,1,6,4},{2,4,3,2,9},
{5,1,0,9,0},{1,1,2,4,0},{2,5,8,5,2},{6,2,0,4,4},{1,5,5,1,1},
{4,0,3,2,9}
};
int main()
{
int k;
__int64 n;
while(scanf("%I64d%d",&n,&k)!=EOF)
{
if(k<0)
{
k=-k;
if(n>24) cout<<0<<endl;
else cout<<a[n-1][5-k]<<endl;
}
else
{
if(n<27)
{
cout<<b[n-1][k-1]<<endl;
}
else
{
double s,T;
__int64 sum;
s=sqrt(2*pi*n)*pow((n*1.0/E),n)*(1+1.0/(12*n));
T=log10(s)-int(log10(s));
T=pow(10,T);
//printf("%lf/n",T);
sum=__int64(T*pow(10,k-1));
//cout<<sum%10<<endl;
printf("%I64d/n",sum%10);
}
}
}
return 0;
}
******************************************************
/*
附上另一种同学的解法。。唉,这方法也不难想到,只是自己被误导了。。
悲剧,整整一天的青春额。。值与不值就在那一念之间。。
*/
#include<iostream>
struct hh
{
double a;
int b;
};
hh num[1000001];
int main(){
double a=1,resf;
int i,k=1,resi,n,m;
for(i=1;i<=1000000;i++){
a*=i;
k*=i;
k%=100000;
while(a>9)
a/=10;
num[i].a=a;num[i].b=k;
}
while(scanf("%d%d",&n,&m)!=EOF){
if(m>0){
resf=num[n].a;
m--;
while(m--)
resf*=10;
printf("%d/n",int(resf)%10);
}else{
m=-m;
resi=num[n].b;
m--;
while(m--)
resi/=10;
printf("%d/n",resi%10);
}
}
return 0;
}