暑假热身 A. GCC

GCC编译器是一个由GNU项目维护的编译系统,它支持多种编程语言的编译。但是它并不包含数学运算符“!”。在数学中,这个符号代表阶乘。表达式n!的意思是从1到n的所有整数的乘积。

例如,4!=4*3*2*1=24. (0!定义为1) 现在请你写程序计算一下 (0! + 1! + 2! + 3! + 4! + ... + n!)%m。

 

Input

第一行是一个整数T,代表了测试数据的组数。

每组测试数据单独一行,包括一个整数n和m,用一个空格隔开。

0 < T <= 20 0 <= n < 10^100 0 < m <= 10000

 

Output

对应每组输入,单独输出一行,给出(0! + 1! + 2! + 3! + 4! + ... + n!)%m的结果。

 

Sample Input

1
10 1017

Sample Output

424

每算一次取一次余有效减少运算量。
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 using namespace std;
 5 int main()
 6 {
 7     long m;
 8     long n = 0;
 9     char ch[110];
10     int num, i;
11 
12     cin >> num;
13     for (int test = 1; test <= num; test++)
14     {
15         scanf("%s %ld", ch, &m);
16         for (i = 0; ch[i] != ''; i++)
17             ;
18         int len = i;
19         if(len>=7)
20         {
21             n=m-1;
22         }
23         else
24         {
25             int k = 1;
26             n = ch[len-1]-'0';
27             for (int j = len-2; j >= 0; --j)
28             {
29                 n += long((ch[j] - '0') * pow(10.0, double(k)));
30                 k ++;
31                 if (n >= m)
32                 {
33                     n = m-1;
34                     break;
35                 }
36             }
37         }
38         long long s = 1;
39         for (i = n; i >= 1; i--)
40         {
41            s = (1 + i * s) % m;
42            //s = 1 % m + ((i % m) * (s % m)) % m;
43         }
44         s %= m;
45         cout << s << endl;
46     }
47     return 0;
48 }
View Code
原文地址:https://www.cnblogs.com/dzzy/p/4733968.html