[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. 浅析 Spring Aop

    aop也是Spring里比较重要的一个点,最近把源码看了下,这里总结一下 使用上主要就下面的点注意下: 相关的Annotaion Around Before After AfterReturning ...

  2. 面试整理(2)跨域:jsonp与CORS

    问题:跨域有哪些方法?jsonp的原理是什么? jsonp: 先说jsonp,jsonp的主要原理是利用script标签的src可以跨域请求,据说有src属性的都可以跨域请求,但script标签返回的 ...

  3. 简易版jquery

    最近写了一个简易版的jquery   github地址:https://github.com/jiangzhenfei/Easy-Jquery 完成的方法: 1.$('#id') 2.extend扩展 ...

  4. react-native关于ios的启动图标设置

    1.首先我们需要使用xcode打开项目,选择项目中的images.xcassets这个文件夹 2.点击AppIcon可以看到右边出现针对不同设备的图标尺寸 3.在左边空白处右击,选择Import... ...

  5. 16 - 文件操作-StringIO-BytesIO

    目录 1 文件操作 1.1 open函数介绍 1.2 打开操作 1.2.1 mode模式 1.2.2 文件指针 1.2.3 缓冲区 1.2.4 encoding编码 1.2.5 其他参数 1.3 读写 ...

  6. 7.Python3标准库--文件系统

    ''' Python的标准库中包含大量工具,可以处理文件系统中的文件,构造和解析文件名,还可以检查文件内容. 处理文件的第一步是要确定处理的文件的名字.Python将文件名表示为简单的字符串,另外还提 ...

  7. Python模块之pxssh

    pxssh模块用于在python中ssh远程连接,执行命令,返回结果,但注意不支持Windows系统 #!/usr/bin/env python #-*- coding:utf-8 -*- from ...

  8. 关于IdByName 为什么一个消息主题要有 Id和 Name的解释

  9. NIO-4pipe

    import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; import org.ju ...

  10. 深度扫盲JavaScript的模块化(AMD , CMD , CommonJs 和 ES6)

    原文地址 https://blog.csdn.net/haochangdi123/article/details/80408874 一.commonJS 1.内存情况 对于基本数据类型,属于复制.即会 ...