luogu P4917 天守阁的地板

背景:

以下图片均来自我的 P D F PDF 文件,谢绝转载。

题目传送门:

https://www.luogu.org/problemnew/show/P4917

题意:

在这里插入图片描述

思路:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define MAXN 1000010
#define mod 19260817
using namespace std;
	LL phi[MAXN],sum_phi[MAXN],fac[MAXN];
	int inv[mod];
	int prime[MAXN];
	int n;
void init(int ma)
{
	int t=0;
	phi[1]=1;
	for(int i=2;i<=ma;i++)
	{
		if(!phi[i]) prime[++t]=i,phi[i]=i-1;
		for(int j=1;j<=t&&i*prime[j]<=ma;j++)
		{
			if(!(i%prime[j]))
			{
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
	fac[0]=1;
	for(int i=1;i<=ma;i++)
	{
		sum_phi[i]=sum_phi[i-1]+phi[i];
		fac[i]=fac[i-1]*i%mod;
	}
	inv[0]=inv[1]=1;
	for(int i=2;i<mod;i++)
		inv[i]=(int)((LL)(mod-mod/i)*inv[mod%i]%mod);
}
LL dg(LL x,LL k)
{
	if(!k) return 1;
	LL o=dg(x,k>>1);
	return k&1?o*o%mod*x%mod:o*o%mod;
}
int main()
{
	int T;
	scanf("%d",&T);
	init(MAXN);
	while(T--)
	{
		LL ans=1;
		scanf("%d",&n);
		for(int l=1,r;l<=n;l=r+1)
		{
			r=n/(n/l);
			ans=ans*dg(fac[r]*inv[fac[l-1]]%mod,sum_phi[n/l]*2-1)%mod;
		}
		printf("%lld\n",dg(fac[n],n*2)*inv[ans*ans%mod]%mod);
	}
}

猜你喜欢

转载自blog.csdn.net/zsyz_ZZY/article/details/84987507