题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3123
思路:当n>=m时,大于等于m的部分的阶乘取模一定为0,所以不用考虑;
当n<m时,从0开始阶乘相加取模,当阶乘取模为0时,之后的阶乘都为0,这些也可以不用考虑。
AC代码:
#include<stdio.h>
#include<string.h>
int main(){
int t,m,i,x,len;
__int64 sum,ans;
char n[105];
scanf("%d",&t);
while(T--){
scanf("%s%d",n,&m);
len=strlen(n);
x=10000005;
if(len<7)
for(i=x=0;i<len;i++)
x=x*10+n[i]-'0';
if(x>=m)
x=m-1;
for(i=1,sum=ans=1;i<=x;i++){
ans=(ans*i)%m;
if(!ans)break;
sum=(sum+ans)%m;
}
printf("%I64d\n",sum%m);
}
return 0;
}