题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3123
1 10 861017
593846
此题n过于庞大,暴力是不可能的,所以必然会有一定的技巧在其中!
思路:当n大于m时 ,n的阶乘中必定包含因数m,所以取余后必定为0。
代码如下:
//#pragma warning (disable:4786)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
const double eps = 1e-9;
//const double pi = atan(1.0)*4;
const double pi = 3.1415926535897932384626;
#define INF 1e18
//typedef long long LL;
typedef __int64 LL;
int main()
{
    int t;
    LL  m;
    char str[1017];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s%I64d",str,&m);
        LL len = strlen(str);
        LL tmp = 1, tt = 0;
        for(int i = 0; i < len; i++)
        {
            tt = tt * 10 + str[i]-'0';
            if(tt >= m)
                break;
        }
        if(tt == 0)
        {
            printf("%I64d\n",1%m);
            continue;
        }
        if(tt == 1)
        {
            printf("%I64d\n",2%m);
            continue;
        }
        LL ans = 2;
        for(int i = 2; i <= m && i <= tt; i++)
        {
            tmp *= i;
            tmp %= m;
            ans += tmp;
            ans %= m;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}
hdu 3123 GCC(数学题),布布扣,bubuko.com
原文地址:http://blog.csdn.net/u012860063/article/details/38615459