重大疑问
查看原帖
重大疑问
174863
2018g20楼主2024/3/3 21:24

错误代码:

#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疑惑,这是为什么

2024/3/3 21:24
加载中...