hdu 3123 GCC

来源:互联网 发布:linux 启动oracle 编辑:程序博客网 时间:2024/04/30 15:20

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;elsesscanf(s,"%d",&n);int ans = p(n);printf("%d\n",ans);}return 0;}