题目意思:给定一个n(n是一个长度为100的大整数)求0! + 1! + 2! +…+n!(mod m)的结果m最大1e6
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char n[105];
typedef long long ll;
ll m,ans;
ll cal(ll n){
if(n == 0||n==1) return 1%m;
ll sum,i,j;
for(sum = 1,j = 1,i = 1;i <= n;i++){
j = j*i%m;
sum = (sum+j)%m;
}
return (sum%m);
}
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%s",n);scanf("%d",&m);
ll tmp = 0,k = 1;
for(int i = strlen(n)-1;i>=0;i--){
tmp+=(n[i]-'0')*k;
k*=10;
if(tmp >= m) break;
}
if(tmp < m){
ans = cal(tmp);
}else ans = cal(m-1);
printf("%lld\n",ans);
}
}