09武汉网选水题= =。。
因为比m大的数阶乘后%m肯定为0,所以只要算比m小的数的阶乘和%m即可。
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
#define MID(x,y) ( ( x + y ) >> 1 )
#define L(x) ( x << 1 )
#define R(x) ( x << 1 | 1 )
#define BUG puts("here!!!")
#define STOP system("pause")
using namespace std;
int MOD;
long long p(int n)
{
if( n == 0 ) return 1 % MOD;
long long ans = 1;
long long sum = 1;
for(int i=1; i<=n; i++)
{
ans *= i;
ans %= MOD;
sum += ans;
sum %= MOD;
}
return sum;
}
bool check(char *s,char *ss)
{
int len1 = strlen(s);
int len2 = strlen(ss);
if( len1 > len2 ) return true;
if( len1 < len2 ) return false;
if( strcmp(s,ss) >= 0 ) return true;
return false;
}
int main()
{
int ncases,n;
char s[200],ss[200];
scanf("%d", &ncases);
while( ncases-- )
{
scanf("%s%d",s,&MOD);
sprintf(ss,"%d",MOD);
if( check(s,ss) )
n = MOD;
else
sscanf(s,"%d",&n);
int ans = p(n);
printf("%d\n",ans);
}
return 0;
}