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\n",(sum+1)%c) ;//还有0的阶乘为1,因为上边没有加上,所以这里要加上

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(gcc)