#include<iostream>
using namespace std;
long long t,p;
long long a[2000003]={1};
long long x,k,l;
long long ksm(long long x,long long y)
{
long long ans=1;
while(y)
{
if(y&1) ans=ans*x%p;
x=x*x%p;
y>>=1;
}
return ans;
}
long long too(long long x)
{
if(x<p) return a[x];
k=x/p;
l=x%p;
return (ksm(a[p-1],k)*too(k)%p)*a[l]%p;
}
int main()
{
cin>>t>>p;
for(long long i=1;i<p;i++) a[i]=(a[i-1]*i)%p;
while(t--)
{
scanf("%lld",&x);
printf("%lld\n",too(x)%p);
}
}
#include<iostream>
using namespace std;
long long t,p;
long long a[2000003]={1};
long long x,k,l;
long long ksm(long long x,long long y)
{
long long ans=1;
while(y)
{
if(y&1) ans=ans*x%p;
x=x*x%p;
y>>=1;
}
return ans;
}
long long too(long long x)
{
if(x<p) return a[x];
return (ksm(a[p-1],x/p)*too(x/p)%p)*a[x%p]%p;
}
int main()
{
cin>>t>>p;
for(long long i=1;i<p;i++) a[i]=(a[i-1]*i)%p;
while(t--)
{
scanf("%lld",&x);
printf("%lld\n",too(x)%p);
}
}
区别就是在too函数中,错误的将x/p,x%p用变量保存,而正确的直接用
MnZn疑惑,这是为什么