[SDOI2017]数字表格

由于使用markdown的关系

我无法很好的掌控格式,见谅

对于这么简单的一道题竟然能在洛谷混到黑,我感到无语

\[\begin{align*}
\prod\limits^{n}_{i=1} \prod\limits^{m}_{j=1} fi[gcd(i,j)] &= \prod\limits^{n}_{d=1} fi[d]^{\sum\limits_{e=1}^{n} [n/de][m/de]\mu(e)} \\
&= \prod\limits^{n}_{T = 1} (\prod\limits_{d|T} fi[d]^{\mu(T/d)})^{[n/T][m/T]}
\end{align*}\]

两步化完式子后

只要预处理函数\(f\prod\limits_{d|n} fi[d]^{\mu(n/d)}\)的前缀积就行

可以做到\(O(n)\)求\(fi\),\(O(n)\)求\(\mu\),枚举因子\(O(n logn)\)求这个函数,\(O(n)\)计算前缀积

为了方便,我们同时求出他们的逆元即可

复杂度\(O(n logn + T\sqrt n \log n)\)

代码

#include <cstdio>
#include <iostream>
#define sid 1000050
#define ll long long
#define mod 1000000007
#define ri register int
using namespace std; const int N = 1000000;
ll fi[sid], f[sid], iv[sid];
int mu[sid], pr[sid], nop[sid], pp, tot; int read() { scanf("%d", &pp); return pp; } ll qpow(ll a, ll k) {
ll ret = 1;
while(k) {
if(k & 1) ret = (ret * a) % mod;
a = (a * a) % mod; k >>= 1;
}
return ret;
} void Get_Fib() {
fi[1] = 1; fi[2] = 1;
for(ri i = 3; i <= N; i ++)
fi[i] = (fi[i - 1] + fi[i - 2]) % mod;
} void Get_Mu() {
mu[1] = 1;
for(ri i = 2; i <= N; i ++) {
if(!nop[i]) { pr[++ tot] = i; mu[i] = -1; }
for(ri j = 1; j <= tot; j ++) {
int h = i * pr[j];
if(h > N) break; nop[h] = 1;
if(i % pr[j] == 0) { mu[h] = 0; break; }
else mu[h] = -mu[i];
}
}
} void Get_f() {
for(ri i = 1; i <= N; i ++) f[i] = 1;
for(ri i = 1; i <= N; i ++) {
ll inv = qpow(fi[i], mod - 2);
for(ri j = i; j <= N; j += i)
if(mu[j / i] == -1) f[j] = (f[j] * inv) % mod;
else if(mu[j / i]) f[j] = (f[j] * fi[i]) % mod;
}
f[0] = 1; iv[0] = 1;
for(ri i = 1; i <= N; i ++) f[i] = (f[i] * f[i - 1]) % mod;
for(ri i = 1; i <= N; i ++) iv[i] = qpow(f[i], mod - 2);
} ll Solve(int n, int m) {
ll ret = 1;
if(n > m) swap(n, m);
for(ri i = 1, j; i <= n; i = j + 1) {
j = min(n / (n / i), m / (m / i));
ret = ret * qpow(f[j] * iv[i - 1] % mod, 1ll * (n / i) * (m / i)) % mod;
}
return ret;
} int main() {
Get_Fib(); Get_Mu(); Get_f();
int Tt = read();
while(Tt --) {
int n = read(), m = read();
printf("%lld\n", Solve(n, m));
}
return 0;
}

[SDOI2017]数字表格 --- 套路反演的更多相关文章

  1. [Sdoi2017]数字表格 [莫比乌斯反演]

    [Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...

  2. BZOJ4816 SDOI2017 数字表格 莫比乌斯反演

    传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...

  3. BZOJ.4816.[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 这个好像简单些啊,只要不犯sb错误 [Update] 真的算反演中比较裸的题了... \(Descriptio ...

  4. 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演

    题目描述 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生 ...

  5. [bzoj4816][Sdoi2017]数字表格 (反演+逆元)

    (真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...

  6. BZOJ 4816 [Sdoi2017]数字表格 ——莫比乌斯反演

    大力反演出奇迹. 然后xjb维护. 毕竟T1 #include <map> #include <ctime> #include <cmath> #include & ...

  7. luogu3704 [SDOI2017]数字表格(莫比乌斯反演)

    link 设\(f_0=0,f_1=1,f_n=f_{n-1}+f_{n-2}(n\ge 2)\) 求\(\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)}\),多组询问, ...

  8. [SDOI2017]数字表格 & [MtOI2019]幽灵乐团

    P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...

  9. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

随机推荐

  1. mysql查询日期相关的

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  2. AES,SHA1,DES,RSA,MD5区别

    AES:更快,兼容设备,安全级别高: SHA1:公钥后处理回传 DES:本地数据,安全级别低 RSA:非对称加密,有公钥和私钥 MD5:防篡改 相关: 公开密钥加密(英语:public-key cry ...

  3. python进阶之py文件内置属性

    前言 对于任何一个python文件来说,当python解释器运行一个py文件,会自动将一些内容加载到内置的属性中:一个模块我们可以看做是一个比类更大的对象. 查看模块的内置属性 我们先创建一个典型的p ...

  4. (转)USB体系结构

    转载地址:http://blog.ednchina.com/zenhuateng/203584/Message.aspx USB总线接口层:物理连接.电气信号环境.信息包传输机制:主机一方由USB主控 ...

  5. loadrunner 测试问题汇总

    1.关于Error -27791: Error -27790:Error -27740:        错误如下:        Action.c(198): Error -27791: Server ...

  6. 微信access_token和refresh_token保存于redis

    简介 通常理解的access_token和refresh_token access_token是用来对客户端进行认证的,类似与密码,有一定的有效期.当过期后可使用refresh_token重新获取一个 ...

  7. rpmdb: Thread/process 9180/139855524558592 failed: Thread died in Berkeley DB library

    使用yum安装出现问题:rpmdb: Thread/process 9180/139855524558592 failed: Thread died in Berkeley DB library 解决 ...

  8. Error: could not open `C:\Java\jre7\lib\i386\jvm.cfg

    打开eclipse时出现Error: could not open `C:\Program Files\Java\jre7\lib\i586\jvm.cfg’) 删除 c:\windows\syste ...

  9. hive的窗口函数ntile、row_number、rank

    一.ntile 序列函数不支持window子句 数据准备: cookie1,--, cookie1,--, cookie1,--, cookie1,--, cookie1,--, cookie1,-- ...

  10. Pandas DataFrame构造简析

    参考书籍:<利用Python进行数据分析> DataFrame简介: DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值.字符串.布尔值等).Dat ...