39
446
1338
助理工程师
使用特权
#include<iostream> #include<string.h> #include<stdio.h> #define MOD 10000 using namespace std; int main(void) { int t; scanf("%d",&t); while(t--) { int i,j; int n,k; int digit,carry; //digit表示当前计算的值的位数,carry表示进位 int f[10000]; char s1[50000]={'\0'}; char s2[5]; long long temp; f[0]=1; digit=1; scanf("%d%d",&n,&k); for(i=2;i<=n;i++) //求n! { carry=0; for(j=0;j<digit;j++) { temp=(long long)(f[j])*(long long)(i)+carry; //此处要用64位数据,防止数据溢出 f[j]=temp%MOD; carry=temp/MOD; } while(carry) { f[digit++]=carry%MOD; carry=carry/MOD; } } i=digit-1; while(f[i]==0) { i--; } sprintf(s2,"%d",f[i]); strcat(s1,s2); i--; for(;i>=0;i--) //将结果存进字符数组中以便于处理 { sprintf(s2,"%04d",f[i]); //不足4位前面补0 strcat(s1,s2); } for(i=strlen(s1)-1;i>=0;i--) { if(s1[i]!='0') break; } printf("%d\n",s1[i-k+1]-48); } return 0; }
#include<iostream> #define MOD 100000 using namespace std; int main(void) { int t; scanf("%d",&t); while(t--) { int n,k; int i,ans; ans=1; scanf("%d %d",&n,&k); for(i=n;i>=2;i--) { ans*=i; while(ans%10==0) //消除末尾的0 { ans/=10; } if(ans>=MOD) //只需保存末尾5位数字即可 ans%=MOD; } for(i=1;i<k;i++) { ans=ans/10; } ans=ans%10; printf("%d\n",ans); } return 0; }
发表回复 本版积分规则 回帖后跳转到最后一页
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注21ic项目外包
扫码关注21ic视频号
扫码关注21ic抖音号
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助
京公网安备 11010802024343号