P4917 天守阁的地板

天守阁的地板

题意即求:

i=1nj=1nlcm(i,j)ilcm(i,j)j(mod19260817)

其中 T103n106

直接推导:

i=1nj=1nlcm(i,j)ilcm(i,j)j=i=1nj=1nijgcd(i,j)2=d=1i=1nj=1n(ijd2)[gcd(i,j)=d]=d=1i=1n/dj=1n/d(ij)[gcd(i,j)=1]=d=1i=1n/dj=1n/d(ij)ki,kjμ(k)=d=1k=1i=1n/kdj=1n/kd(ijk2)μ(k)=T=1dTi=1n/Tj=1n/T(ijd2)μ(d)=(T=1dTi=1n/Tj=1n/T(ij)μ(d))(T=1dTi=1n/Tj=1n/Td2μ(d))=(T=1i=1n/Tj=1n/T(ij)dTμ(d))(T=1(dTd2μ(d))n/T2)=(T=1i=1n/Tj=1n/T(ij)[T=1])(T=1(dTd2μ(d))n/T2)=(n!)2n(T=1(dTd2μ(d))n/T2)

预处理后,后面的那一部分整除分块即可。

时间复杂度 O(nlnn+Tnlogn)

代码:

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
namespace Ehnaev{
  inline ll read() {
    ll ret=0,f=1;char ch=getchar();
    while(ch<48||ch>57) {if(ch==45) f=-f;ch=getchar();}
    while(ch>=48&&ch<=57) {ret=(ret<<3)+(ret<<1)+ch-48;ch=getchar();}
    return ret*f;
  }
  inline void write(ll x) {
    static char buf[22];static ll len=-1;
    if(x>=0) {do{buf[++len]=x%10+48;x/=10;}while(x);}
    else {putchar(45);do{buf[++len]=-(x%10)+48;x/=10;}while(x);}
    while(len>=0) putchar(buf[len--]);
  }
}using Ehnaev::read;using Ehnaev::write;
inline void writeln(ll x) {write(x);putchar(10);}

const ll mo=19260817,N=1e6;

inline ll Qpow(ll b,ll p) {
  ll r=1;while(p) {if(p&1) r=r*b%mo;b=b*b%mo;p>>=1;}return r;
}

ll T,n,cnt;
ll mu[N+5],prime[N+5],f[N+5],fc[N+5];
bool ff[N+5];

inline void Init() {
  ff[1]=1;mu[1]=1;
  for(ll i=2;i<=N;i++) {
    if(!ff[i]) {prime[++cnt]=i;mu[i]=mo-1;}
    for(ll j=1;j<=cnt&&i*prime[j]<=N;j++) {
      ff[i*prime[j]]=1;
      if(i%prime[j]==0) {
        mu[i*prime[j]]=0;break;
      }
      mu[i*prime[j]]=mu[i]*mu[prime[j]]%mo;
    }
  }
  fc[0]=1;f[0]=1;
  for(ll i=1;i<=N;i++) {fc[i]=fc[i-1]*i%mo;f[i]=1;}
  for(ll i=1;i<=N;i++) {
    if(mu[i]==0) continue;
    ll tmp=i*i%mo;ll invtmp=Qpow(tmp,mo-2);
    for(ll j=i;j<=N;j+=i) {
      if(mu[i]==mo-1) f[j]=f[j]*invtmp%mo;
      else f[j]=f[j]*tmp%mo;
    }
  }
  for(ll i=1;i<=N;i++) f[i]=f[i-1]*f[i]%mo;
}

int main() {

  T=read();Init();

  while(T--) {
    n=read();ll ans=1;
    for(ll i=1,j;i<=n;i=j+1) {
      j=n/(n/i);
      ll tmp=f[j]*Qpow(f[i-1],mo-2)%mo;
      tmp=Qpow(tmp,(n/i)*(n/i)%(mo-1)+mo-1);
      ans=ans*tmp%mo;
    }
    ans=ans*Qpow(fc[n],2*n)%mo;
    writeln(ans);
  }

  return 0;
}
posted @   Aryper  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示