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

题面

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

多组数据。

  • \(30pts\) \(n\leq100,T\leq100\)
  • \(60pts\) \(n\leq3*10^4,T\leq300\)
  • \(100pts\) \(a,b\leq10^5,T\leq1000\)

解析

显然答案是$$\frac{lcm(a,b)}{a}*\frac{lcm(a,b)}{b}$$

暴力复杂度\(O(Tn^2logn)\),可以通过\(30pts\)。

考虑推推柿子。

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

\[=\prod_{a=1}^n\prod_{b=1}^n\frac{lcm^2(a,b)}{ab}
\]

\[=\prod_{a=1}^n\prod_{b=1}^n\frac{ab}{gcd^2(a,b)}
\]

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

现在问题是\(\prod_{a=1}^n\prod_{b=1}^ngcd(a,b)\)。

这个复杂度\(O(n^2)\),很不划算。

考虑枚举最大公约数的值。

则化为

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

\[\prod_{d=1}^nd^{\sum_{a=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{b=1}^{\lfloor\frac{n}{d}\rfloor}[gcd(a,b)==1]}
\]

这个指数怎么化呢?

我们可以强制\(a>b\),那么指数为\(\sum_{a=1}^{\lfloor\frac{n}{d}\rfloor}\varphi(a)\)

如果不强制,考虑到\(\varphi(1)=1\)的特殊情况,柿子可化为:

\[\prod_{d=1}^nd^{[\sum_{a=1}^{\lfloor\frac{n}{d}\rfloor}2*\varphi(a)]-1}
\]

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

然后吗,注意到\(\lfloor\frac{n}{d}\rfloor\)在一段区间内是相同的,可以数论分块。

于是就做完了。

预处理逆元后,复杂度\(O(T\sqrt 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\n",ans);
}
return 0;
}

luogu4917天守阁的地板的更多相关文章

  1. 【洛谷】4917:天守阁的地板【欧拉函数的应用】【lcm与gcd】【同除根号优化】

    P4917 天守阁的地板 题目背景 在下克上异变中,博丽灵梦为了找到异变的源头,一路打到了天守阁 异变主谋鬼人正邪为了迎击,将天守阁反复颠倒过来,而年久失修的天守阁也因此掉下了很多块地板 异变结束后, ...

  2. Luogu 4917 天守阁的地板(莫比乌斯反演+线性筛)

    既然已经学傻了,这个题当然是上反演辣. 对于求积的式子,考虑把[gcd=1]放到指数上.一通套路后可以得到∏D∏d∏i∏j (ijd2)μ(d) (D=1~n,d|D,i,j=1~n/D). 冷静分析 ...

  3. [ Luogu 4917 ] 天守阁的地板

    \(\\\) \(Description\) 定义二元函数\(F(x,y)\)表示,用 \(x\times y\) 的矩形不可旋转的铺成一个任意边长的正方形,所需要的最少的矩形个数. 现在\(T\)组 ...

  4. 省选前的th题

    沙茶博主终于整完了知识点并学完了早该在NOIP之前学的知识们 于是终于开始见题了,之前那个奇怪的题单的结果就是这个了 题目按沙茶博主的做题顺序排序 个人感觉(暂时)意义不大的已被自动忽略 洛谷 491 ...

  5. X000011

    P1890 gcd区间 \(\gcd\) 是满足结合律的,所以考虑用 ST 表解决 时间复杂度 \(O((n\log n+m)\log a_i)\) 考虑到 \(n\) 很小,你也可以直接算出所有的区 ...

  6. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  7. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  8. vijos1144(小胖守皇宫)

    也是ural1039 描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步 ...

  9. zz 圣诞丨太阁所有的免费算法视频资料整理

    首发于 太阁实验室 关注专栏   写文章     圣诞丨太阁所有的免费算法视频资料整理 Ray Cao· 12 小时前 感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法 ...

随机推荐

  1. SQL2012通用分页存储过程

    --提取分页数据,返回总记录数 Createprocedure [dbo].[sp_Common_GetDataPaging_ReturnDataCount] ( @SqlString varchar ...

  2. 【转】关于大型网站技术演进的思考(二十)--网站静态化处理—web前端优化—中(12)

    Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原理,很有可能掉进这些陷阱里,最终没有达到最佳 ...

  3. hdu 2063最大匹配

    #include<stdio.h> #include<string.h> int link[600],mark[600],map[600][600],m,n; int find ...

  4. HDU 3763 CDs

    http://acm.hdu.edu.cn/showproblem.php?pid=3763 题意: 两组数据 看重复的有多少 如果每输入一个就去查找的话O(n^2) 会超时 所以可以用二法 第一组数 ...

  5. 学.net必学的东西 10项【不知道我能不能学这么多,!- -,光程序编辑我都累死了】

    原文发布时间为:2008-10-30 -- 来源于本人的百度文章 [由搬家工具导入] 10项.NET必学的技术2007年08月28日 星期二 14:58 1、WCF (Windows Communic ...

  6. Free Web Application Firewall相关资料

    http://www.freewaf.org/solution/#1 http://baike.soso.com/v60659982.htm

  7. php 压缩数据存储

    php 压缩数据存储 当接收到大量的数据时,存储到数据库和从数据库读取时,时间都比较慢,所以压缩一下入库可能会好一点. 仅供参考!!! 封装的压缩数据函数: /** * 压缩数据 * @param s ...

  8. spring/spring boot/spring mvc中用到的注解

    在spring Boot中几乎可以完全弃用xml配置文件,本文的主题是分析常用的注解. Spring最开始是为了解决EJB等大型企业框架对应用程序的侵入性,因此大量依靠配置文件来“非侵入式”得给POJ ...

  9. 【.Net 学习系列】-- Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库

    参考资料: WindowsIdentity.Impersonate https://msdn.microsoft.com/zh-cn/library/w070t6ka(v=vs.110).aspx A ...

  10. 学习MarkDown--初体验

    学习MarkDownPad 突然兴趣来了,在博客园里面也有Markdown的格式,昨天晚上安装了MarkDownPad pro这个是免费的,但是有些功能不支持.本来想破解的,百度了很多方法感觉不靠谱, ...