http://acm.hdu.edu.cn/showproblem.php?pid=3123
题意:!代表阶乘,0的阶乘为1,求(0! + 1! + 2! + 3! + 4! + ... + n!)%m的结果。
思路:一开始想的复杂了,因为题中n的范围太大了,所以想用大数乘法来着,结果因为阶乘的和还要加起来取余,所以以为还要大数加,再来一个n(a + b) % p = (a % p + b % p) % p这个公式就差不多了,但是想的太多了,真的很复杂,其实没有那么复杂,就是判断一下n和m 的大小,因为如果n比m大的话,从m!+(m+1)!....n!这一些对m取余都是0,所以就不需考虑了,而剩下的最大也就是m的范围,就不用大数去处理了,用long long存一下也不会超
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char sh[300],ch[3000] ; int n ; scanf("%d",&n) ; for(int i = 0 ; i < n ; i++) { scanf("%s %s",sh,ch) ; int len1 = strlen(sh) ; int len2 = strlen(ch) ; long long s = atoi(sh) ;//将字符串转化成整型数 long long c = atoi(ch) ; if(len1 > len2)//如果第一个字符串比第二个的长,说明n肯定比m大 s = c-1 ; if(len1 == len2&&s > c) s = c-1 ; long long factorial = 1 ; long long sum = 0 ; long long j ; for(j = 1 ; j <= s ; j++) { factorial = (factorial*j)%c ; sum = (sum+factorial)%c ; } printf("%lld ",(sum+1)%c) ;//还有0的阶乘为1,因为上边没有加上,所以这里要加上 } return 0 ; }