1. 程式人生 > >luogu P4917 天守閣的地板

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); } }