暑假热身 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] != '\0'; 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 }