给定n,m,求(n!)!模m的值。其中!代表阶乘,模代表取余运算。
输入描述:
第一行T,m,T代表数据组数,m代表模数。接下来T行,每行一个正整数,代表n。(所有的n共用一个模数m)。
1≤T≤105 , 1≤n,m≤106
输出描述:
对于每个n,输出一个正整数,代表(n!)!模m的值。示例1
输入
2 44137 2 3输出
2 720示例2
输入
2 523 3 4输出
197 225
首先如果正常运算一定会超时,这里我们要知道一个性质,就是如果这个数的阶乘大于mod,那么这个数以及之后的数的阶乘的阶乘取模于mod就等于0,这样我们就可以简化处理了
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=1e6;
ll fac[maxn];
ll sum;
int main()
{
int n, m;
int tt;
cin >> tt>>m;
fac[0]=1;
int k=0;
sum=1;
for(int i=1;i<=maxn;i++)
{
fac[i]=(fac[i-1]*i)%m;
sum*=i;//i!
if(sum>=m&&!k)k=i;
}
while (tt--)
{
cin>>n;
if(n>=k)cout<<"0"<<endl;
else
{
cout<<fac[fac[n]]%m<<endl;
}
}
return 0;
}