HDU 3123 GCC

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 ;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3404124.html