• luogu4917天守阁的地板


    https://www.zybuluo.com/ysner/note/1317548---

    题面

    给出(n),用所有长为(a)、宽为(b)((1leq a,bleq n))的长方形拼成正方形,最少需多少块?
    多组数据。

    • (30pts) (nleq100,Tleq100)
    • (60pts) (nleq3*10^4,Tleq300)
    • (100pts) (a,bleq10^5,Tleq1000)

    解析

    显然答案是$$frac{lcm(a,b)}{a}*frac{lcm(a,b)}{b}$$
    暴力复杂度(O(Tn^2logn)),可以通过(30pts)

    考虑推推柿子。

    [prod_{a=1}^nprod_{b=1}^nfrac{lcm(a,b)}{a}*frac{lcm(a,b)}{b} ]

    [=prod_{a=1}^nprod_{b=1}^nfrac{lcm^2(a,b)}{ab} ]

    [=prod_{a=1}^nprod_{b=1}^nfrac{ab}{gcd^2(a,b)} ]

    [=frac{(n!)^{2n}}{prod_{a=1}^nprod_{b=1}^ngcd^2(a,b)} ]

    现在问题是(prod_{a=1}^nprod_{b=1}^ngcd(a,b))
    这个复杂度(O(n^2)),很不划算。
    考虑枚举最大公约数的值。
    则化为

    [prod_{d=1}^nd^{sum_{a=1}^nsum_{b=1}^n[gcd(a,b)==d]} ]

    [prod_{d=1}^nd^{sum_{a=1}^{lfloorfrac{n}{d} floor}sum_{b=1}^{lfloorfrac{n}{d} floor}[gcd(a,b)==1]} ]

    这个指数怎么化呢?
    我们可以强制(a>b),那么指数为(sum_{a=1}^{lfloorfrac{n}{d} floor}varphi(a))
    如果不强制,考虑到(varphi(1)=1)的特殊情况,柿子可化为:

    [prod_{d=1}^nd^{[sum_{a=1}^{lfloorfrac{n}{d} floor}2*varphi(a)]-1} ]

    然后线性预处理一下欧拉函数前缀和,这样复杂度(O(Tn))(60pts)稳了。

    然后吗,注意到(lfloorfrac{n}{d} floor)在一段区间内是相同的,可以数论分块。
    于是就做完了。
    预处理逆元后,复杂度(O(Tsqrt n))。

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    #define re register
    #define il inline
    #define fp(i,a,b) for(re int i=a;i<=b;i++)
    #define fq(i,a,b) for(re int i=a;i>=b;i--)
    using namespace std;
    const int mod=19260817,N=1e6+100;
    int a,b,jc[N],pri[N],ol[N],n,tot,inv[mod+100];
    ll ans,gu;
    bool vis[N];
    il ll gi()
    {
      re ll x=0,t=1;
      re char ch=getchar();
      while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
      if(ch=='-') t=-1,ch=getchar();
      while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
      return x*t;
    }
    il ll ksm(re ll S,re ll n)
    {
      re ll T=S;S=1;
      if(n<0) return 0;
      while(n)
        {
          if(n&1) S=S*T%mod;
          T=T*T%mod;
          n>>=1;
        }
      return S;
    }
    il void Pre(re int n)
    {
      ol[1]=1;
      fp(i,2,n)
        {
          if(!vis[i]) pri[++tot]=i,ol[i]=i-1;
          for(re int j=1;j<=tot&&i*pri[j]<=n;++j)
        {
          vis[i*pri[j]]=1;
          if(i%pri[j]) ol[i*pri[j]]=ol[i]*(pri[j]-1);
          else {ol[i*pri[j]]=ol[i]*pri[j];break;}
        }
        }
      fp(i,1,n) (ol[i]+=ol[i-1])%=(mod-1);
      jc[0]=1;fp(i,1,n) jc[i]=1ll*jc[i-1]*i%mod;
      inv[0]=inv[1]=1;fp(i,2,mod) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
    }	  
    int main()
    {
      re int T=gi();
      Pre(1e6);
      while(T--)
        {
          n=gi();
          ans=ksm(jc[n],2*n);gu=1;
          re int L=0;
          for(re int i=1;i<=n;i=L+1)
        {
          L=n/(n/i);
          (gu*=ksm(1ll*jc[L]*inv[jc[i-1]]%mod,2*ol[n/i]-1))%=mod;
        }
          (ans*=inv[gu*gu%mod])%=mod;
          printf("%lld
    ",ans);
        }
      return 0;
    }
    
  • 相关阅读:
    《芒果TV》UWP版利用Windows10通用平台特性,率先支持Xbox One平台
    Win10《芒果TV》内测版现已支持在国行版 Xbox One 下载体验
    Win10《芒果TV》商店内测版更新至v3.1.6:率先支持Xbox One平台
    HLS(HTTP Live Streaming)学习和探讨
    喜迎Win10周年版,芒果TV UWP完善手机视频离线下载
    Windows10 1607 x64/x86 + Office 2016 Win/Mac + KMS激活/安装密钥汇总
    Win10商店芒果TV UWP版更新,新增后台视频下载
    Win10 UWP版《芒果TV》v2.4.0直播超女,芒果台综艺一网打尽
    (三)3-3 Python的一般形式和参数
    (三)3-1 练习
  • 原文地址:https://www.cnblogs.com/yanshannan/p/9831937.html
Copyright © 2020-2023  润新知