Luogu P4917 天守阁的地板
jszjinshengzhi · · 题解
Luogu P4917 天守阁的地板
题意:给定长者生日19260817)。
数据范围:多组数据,
分析:对于
所以
接下来就是暴力推柿子了。
看着
注意到
直接把分数化开来推想想都觉得很麻烦,而分子部分只有
分子
分母
分母中的
复杂度:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define p 19260817
inline ll fpow(ll a,ll b){
ll ret=1;
for(;b;ret*=((b&1)?a:1),ret%=p,a=a*a%p,b>>=1);
return ret;
}
#define maxn 1000005
ll phi[maxn],fac[maxn];
ll cnt,prime[maxn];
inline void init(){
phi[1]=1;
for(ll i=2;i<maxn;++i){
if(!phi[i]){
phi[i]=i-1;
prime[++cnt]=i;
}
for(ll j=1;j<=cnt&&prime[j]*i<maxn;++j){
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
fac[0]=1;
for(ll i=1;i<maxn;++i){
phi[i]=(phi[i]+phi[i-1])%(p-1);//!!!这里模的是p-1,因为phi出现在指数中!!!
fac[i]=fac[i-1]*i%p;
}
}
int T;
ll n,ans;
int main(){
init();
scanf("%d",&T);
while(T--){
scanf("%lld",&n);
ans=1;
for(ll l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans=ans*fpow(fac[r]*fpow(fac[l-1],p-2)%p,phi[n/l])%p;
}
printf("%lld\n",fpow(fac[n],2*n+2)*fpow(ans,p-5)%p);//这里的fpow(ans,p-5)表示ans^4的逆元
}
return 0;
}