题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3123
求0到n的各项的阶乘和对m取模。
思路:根据取模运算性质,(a * b) % p = (a % p * b % p) % p 和 ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p 当n>=m时,第n项阶乘对m取模为0。得到这样暴力解决之。
注意:
1.阶乘要用递推求;
2.输入要用字符串
AC代码:
#include<stdio.h>
#include<string.h>
#define ll __int64
int main()
{
ll t,i,m;
ll len;
char s[1100];
while(scanf("%I64d",&t)!=EOF)
{
while(t--)
{
scanf("%s %I64d",s,&m);
len=strlen(s);
ll temp=0,t=1;
for(i=len-1;i>=0;i--)
{
temp+=(s[i]-'0')*t;
t=t*10;
if(temp>=m)
break;
}
if(temp<=1)
{
printf("%I64d\n",(temp+1)%m);
continue;
}
ll sum=2,s=1;
for(i=2;i<=temp && i<=m;i++) //temp 和m取个最小
{
s*=i%m;
s%=m;
sum+=s%m;
sum%=m;
}
printf("%I64d\n",sum%m);
}
}
return 0;
}