分析,本题目利用公式
(a * b) % m = [( a%m ) * ( b%m )] % m ,计算阶乘模m的值
(a + b) % m = [(a % m) + (b % m)] % m ,计算所有阶乘的余数树的和mod m 的值
由于,n > m时,只用计算到 (m-1)! ,n < m , n 的值在六位以内;故总体用整形数据类型就行,不存在大数加法乘法,非常容易
注意计算过程中 (a % m) * (b % m) 可能会超出整形的范围,用64位整形!
总体看来,我对这方面的题很不熟练啊,字符串和数之间的转换总会出问题……再者,就是看到题后没好好分析题目,不懂得题中奥妙啊~~
#include<stdio.h>
#include<string.h>
int main()
{
__int64 yushu,result;
int max,m,i,len,cas;
char n[101];
scanf("%d",&cas);
getchar();
while(cas--)
{
scanf( "%s%d", n, &m);
len = strlen(n);
if(len >= 7) //对应 n > m 的情况,只用计算到 (m - 1)!
max = m;
else
{
max = 0;
for( i = 0;i < len ; i++)
{
max = max * 10 + n[i] - '0'; //计算 n 的值(此时 n 最多是个六位数字)
if( max > m) //如果 n > m ,取 max = m
{
max = m;
break;
}
}
}
yushu = 1;
result = 1;
for(i = 1 ;i <= max ; i++) // attention !! max==0 的情况考虑一下,此时没有进去循环
{
yushu = (yushu * i) % m;
result = (result + yushu) % m;
}
printf("%I64d\n",result%m); //把这里改了就对了,可是为啥啊?? 唉,防止 n=0 时没有进行取模运算
}
return 0;
}
//呜呜——感觉自己好挫!!! 当 n = 0 时,没有进行模运算,result==1 ,看着好像没错,可是看这组数据 n = 0, m = 1 还能输出 1 ?!
//两点:1、算法感觉没错时,看看是不是自己的数据类型、空间能弄错了;2、找一些特殊的数据测试一下 (特别大的,特别小的)