您的位置:首页 > 其它

暑假热身 A. GCC

2015-08-16 11:53 211 查看
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

每算一次取一次余有效减少运算量。


#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
long m;
long n = 0;
char ch[110];
int num, i;

cin >> num;
for (int test = 1; test <= num; test++)
{
scanf("%s %ld", ch, &m);
for (i = 0; ch[i] != '\0'; i++)
;
int len = i;
if(len>=7)
{
n=m-1;
}
else
{
int k = 1;
n = ch[len-1]-'0';
for (int j = len-2; j >= 0; --j)
{
n += long((ch[j] - '0') * pow(10.0, double(k)));
k ++;
if (n >= m)
{
n = m-1;
break;
}
}
}
long long s = 1;
for (i = n; i >= 1; i--)
{
s = (1 + i * s) % m;
//s = 1 % m + ((i % m) * (s % m)) % m;
}
s %= m;
cout << s << endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: