数论 模
#include <iostream> #include <cstdio> #include <string.h> using namespace std; const int maxn=110; char n[maxn],m[maxn]; int int_m; int len1,len2; int judge() { if(len1>len2) return 1; char tn[maxn],tm[maxn]; int i,j; for(i=len1-1,j=0;i>=0;i--,j++) tn[j]=n[i]; tn[j]='\0'; for(i=len2-1,j=0;i>=0;i--,j++) tm[j]=m[i]; tm[j]='\0'; return strcmp(tn,tm); } int main() { int t; cin>>t; while(t--) { int i,j; getchar(); scanf("%s %s",n,m); len1=strlen(n); len2=strlen(m); int flag=judge(); int tem=0; int_m=0; for(i=0;i<len2;i++) int_m=int_m*10+m[i]-'0'; if(flag==1) tem=int_m; else { for(i=0;i<len1;i++) tem=tem*10+n[i]-'0'; } long long sum_mod=1%int_m; int tsum=1%int_m; for(i=1;i<=tem;i++) { tsum=((long long)tsum*(i%int_m))%int_m;//注意乘的过程中可能会溢出 sum_mod=(sum_mod+tsum)%int_m; } printf("%I64d\n",sum_mod); } return 0; }