数论 模
#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;
}