[关闭]
@ysner 2018-10-22T18:45:37.000000Z 字数 2154 阅读 1702

luogu4917天守阁的地板

数论 分块


题面

给出,用所有长为、宽为的长方形拼成正方形,最少需多少块?
多组数据。

解析

显然答案是


暴力复杂度,可以通过

考虑推推柿子。




现在问题是
这个复杂度,很不划算。
考虑枚举最大公约数的值。
则化为



这个指数怎么化呢?
我们可以强制,那么指数为
如果不强制,考虑到的特殊情况,柿子可化为:

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

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

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #define ll long long
  8. #define re register
  9. #define il inline
  10. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  11. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  12. using namespace std;
  13. const int mod=19260817,N=1e6+100;
  14. int a,b,jc[N],pri[N],ol[N],n,tot,inv[mod+100];
  15. ll ans,gu;
  16. bool vis[N];
  17. il ll gi()
  18. {
  19. re ll x=0,t=1;
  20. re char ch=getchar();
  21. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  22. if(ch=='-') t=-1,ch=getchar();
  23. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  24. return x*t;
  25. }
  26. il ll ksm(re ll S,re ll n)
  27. {
  28. re ll T=S;S=1;
  29. if(n<0) return 0;
  30. while(n)
  31. {
  32. if(n&1) S=S*T%mod;
  33. T=T*T%mod;
  34. n>>=1;
  35. }
  36. return S;
  37. }
  38. il void Pre(re int n)
  39. {
  40. ol[1]=1;
  41. fp(i,2,n)
  42. {
  43. if(!vis[i]) pri[++tot]=i,ol[i]=i-1;
  44. for(re int j=1;j<=tot&&i*pri[j]<=n;++j)
  45. {
  46. vis[i*pri[j]]=1;
  47. if(i%pri[j]) ol[i*pri[j]]=ol[i]*(pri[j]-1);
  48. else {ol[i*pri[j]]=ol[i]*pri[j];break;}
  49. }
  50. }
  51. fp(i,1,n) (ol[i]+=ol[i-1])%=(mod-1);
  52. jc[0]=1;fp(i,1,n) jc[i]=1ll*jc[i-1]*i%mod;
  53. inv[0]=inv[1]=1;fp(i,2,mod) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
  54. }
  55. int main()
  56. {
  57. re int T=gi();
  58. Pre(1e6);
  59. while(T--)
  60. {
  61. n=gi();
  62. ans=ksm(jc[n],2*n);gu=1;
  63. re int L=0;
  64. for(re int i=1;i<=n;i=L+1)
  65. {
  66. L=n/(n/i);
  67. (gu*=ksm(1ll*jc[L]*inv[jc[i-1]]%mod,2*ol[n/i]-1))%=mod;
  68. }
  69. (ans*=inv[gu*gu%mod])%=mod;
  70. printf("%lld\n",ans);
  71. }
  72. return 0;
  73. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注