博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ4816][SDOI2017]数字表格(莫比乌斯反演)
阅读量:4685 次
发布时间:2019-06-09

本文共 2564 字,大约阅读时间需要 8 分钟。

4816: [Sdoi2017]数字表格

Time Limit: 50 Sec  Memory Limit: 128 MB
Submit: 1259  Solved: 625
[][][]

Description

Doris刚刚学习了fibonacci数列。用f[i]表示数列的第i项,那么
f[0]=0
f[1]=1
f[n]=f[n-1]+f[n-2],n>=2
Doris用老师的超级计算机生成了一个n×m的表格,第i行第j列的格子中的数是f[gcd(i,j)],其中gcd(i,j)表示i,
j的最大公约数。Doris的表格中共有n×m个数,她想知道这些数的乘积是多少。答案对10^9+7取模。

Input

有多组测试数据。

第一个一个数T,表示数据组数。
接下来T行,每行两个数n,m
T<=1000,1<=n,m<=10^6

Output

输出T行,第i行的数是第i组数据的结果

Sample Input

3
2 3
4 5
6 7

Sample Output

1
6
960

HINT

Source

[ ][ ][ ]

不知道为什么要用fibonacci,感觉既没有用到矩乘又没有用到$gcd(f[i],f[j])=f[gcd(i,j)]$的性质。

首先列出连乘式,可以发现很像莫比乌斯反演,先试着推一下式子,从每个数出现的次数入手。

$$Ans(n,m)=\prod_{d}f(d)^{\sum_{i=1}^{n}\sum_{j=1}^m[(i,j)=d]}=\prod_{d=1}^{\min(n,m)}f(d)^{\sum_{p=1}^{\frac{\min(n,m)}{d}}\mu(d)\lfloor \frac{n}{pd}\rfloor \lfloor\frac{m}{pd}\rfloor}$$

到这里,有一种想法(可以拿60分):
设$$g(n,m,d)=\sum_{i=1}^{\min(n,m)}\mu(d)\lfloor \frac{n}{i} \rfloor \lfloor \frac{m}{i}\rfloor$$
这样$$Ans(n,m)=\prod_{d=1}^{\lfloor \frac{\min(n,m)}{d} \rfloor}f(d)^{g(\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor,d)}$$
这个看上去用分块优化可以做到$$\begin{aligned}O(T\int_1^n\sqrt{\frac{n}{x}}dx)& =O(T\sqrt{n}\int_1^n\sqrt{\frac{1}{x}}dx)\\ & =O(2T\sqrt{n}\sqrt{n})\\ & =O(Tn)\end{aligned}$$

于是就有60分了。

那么我们继续化简刚才的式子:
$$\begin{aligned}Ans(n,m)& =\prod_{d=1}^{\min(n,m)}f(d)^{\sum_{d|T}^{\min(n,m)}\mu(\frac{T}{d})\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T}\rfloor}\\ & =\prod_{T=1}^{\min(n,m)}\prod_{d|T}f(d)^{\mu(\frac{T}{d})\lfloor \frac{n}{T} \rfloor\lfloor\frac{m}{T}\rfloor}\\ & =\prod_{T=1}^{\min(n,m)}g(T)^{\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}\end{aligned}$$ $g(T)$可以预处理出来,这样总复杂度就是$O(n\log n+T\sqrt{\min(n,m)})$了。
注意$\mu$在指数上时会有$-1$,这个要求逆元,如果先预处理所有$f[i]$的逆元的话会快一倍。
这道题总体并不难,主要就是将莫比乌斯反演中的一些套路从加法变成乘法了,实现的时候有几个细节注意一下就好。

(以后再也不手写LaTeX莫比乌斯反演的题解了)

1 #include
2 #include
3 #define rg register int 4 #define rep(i,l,r) for (rg i=l; i<=r; i++) 5 typedef long long ll; 6 using namespace std; 7 8 const int N=1000100,mod=1000000007; 9 bool b[N];10 int n,m,T,ans,tot,p[N],f[N],g[N],G[N],G1[N],miu[N],F[N][3];11 12 int ksm(int a,int b){13 int res;14 for (res=1; b; a=1ll*a*a%mod,b>>=1)15 if (b & 1) res=1ll*res*a%mod;16 return res;17 }18 19 void pre(){20 miu[1]=1;21 for (rg i=2; i
m) swap(n,m); ans=1;44 for (rg i=1; i<=n; i=lst+1){45 lst=min(n/(n/i),m/(m/i));46 ans=1ll*ans*ksm(1ll*G[lst]*G1[i-1]%mod,1ll*(n/i)*(m/i)%(mod-1))%mod;47 }48 printf("%d\n",ans);49 }50 return 0;51 }

 

转载于:https://www.cnblogs.com/HocRiser/p/8718612.html

你可能感兴趣的文章
23 Java学习之RandomAccessFile
查看>>
SSH远程会话管理工具 - screen使用教程
查看>>
hibernate validation HV000030: No validator could be found for constraint
查看>>
Telink MESH SDK 如何使用PWM
查看>>
LR SP PC
查看>>
C# 图片识别(支持21种语言)【转】
查看>>
jQuery基础教程
查看>>
P2709 小B的询问
查看>>
完全背包问题
查看>>
【Hibernate 7】浅谈Hibernate的缓存机制
查看>>
润乾报表 动态控制文本的显示
查看>>
[oracle] 如何使用myBatis在数据库中插入数据并返回主键
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>
poj 1979 Red and Black(dfs)
查看>>
【.Net基础03】HttpWebRequest模拟浏览器登陆
查看>>
UML-画类图与交互图的顺序
查看>>
杭电1060
查看>>
webdriver test1
查看>>