HDU 3123 GCC
先观察一下数据范围
0 < T <= 20
0 <= n < 10^100 (without leading zero)
0 < m < 1000000
N这么大,一开始想到是大数运算,但肯定超时,所以一定有巧妙的地方。
注意到要取余!!!! (M!)%M结果一定是0。那么(M+1)%M、(M+2)%M......结果一定全部为0.
题目中的M大小只有1000000,所以只要算前1000000项就可以了。
一开始的时候特判一下n和m哪个大,取小的那个算和。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; int T; int MOD; long long a[1000000+5]; long long ans; char s[1000]; int Min; int n; int main() { scanf("%d",&T); while(T--) { scanf("%s%d",s,&MOD); a[0]=1; for(int i=1; i<=1000000; i++) a[i]=(i*a[i-1])%MOD; if(strlen(s)>=7) Min=MOD; else { n=0; for(int i=0; i<strlen(s); i++) n=n*10+s[i]-'0'; Min=min(n,MOD); } ans=0; for(int i=0; i<=Min; i++) ans=(ans+a[i])%MOD; printf("%d\n",ans); } return 0; }