列一下式子:

      $\prod_{i = 1}^{n}\prod_{j = 1}^{m}fib_{gcd(i, j)}$

很套路的变成这样:

      $\prod_{d = 1}^{min(n, m)}fib_{d}^{\sum_{i = 1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j = 1}^{\left \lfloor \frac{m}{d} \right \rfloor}[gcd(i, j) == 1]}$

右上角的那个东西:

      $\sum_{i = 1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j = 1}^{\left \lfloor \frac{m}{d} \right \rfloor}[gcd(i, j) == 1]$

太熟悉了。

      $\sum_{d = 1}^{min(n, m)}\sum_{t = 1}^{min(\left \lfloor \frac{n}{d} \right \rfloor,\left \lfloor \frac{m}{d} \right \rfloor)}\mu (t) * \left \lfloor \frac{n}{td} \right \rfloor * \left \lfloor \frac{m}{td} \right \rfloor$

代回去之后按照套路枚举$T = dt$:

      $\prod_{T = 1}^{min(n, m)}\sum_{d | T}fib^{\left \lfloor \frac{n}{T} \right \rfloor\left \lfloor \frac{m}{T} \right \rfloor \mu (\frac{T}{d})}_{d}$

这样子的话我们记$h(i) = \sum_{d | T}fib^{\mu (\frac{T}{d})}_{d}$

原式就变为:

      $\prod_{T = 1}^{min(n, m)}h(T)^{\left \lfloor \frac{n}{T} \right \rfloor\left \lfloor \frac{m}{T} \right \rfloor}$。

发现外面已经可以整除分块了。

然而这个$h(i)$怎么办,这玩意...不能线性筛的呀。

喂喂,不能线性筛就暴力算吧,暴力...似乎并不慢啊,其实是一个$O(nlogn)$。

注意到$\mu (i) == -1$的时候其实是乘上一个逆元。

时间复杂度$O(MaxNlogMaxN + T \sqrt{n} )$。

复杂度写的并不严格。

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 1e6 + ;
const ll P = 1e9 + ; int testCase, pCnt = , pri[N];
ll mu[N], fib[N], h[N];
bool np[N]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline ll pow(ll x, ll y) {
ll res = 1LL;
for(; y > ; y >>= ) {
if(y & ) res = res * x % P;
x = x * x % P;
}
return res;
} ll inv(ll x) {
return pow(x, P - );
} void sieve() {
fib[] = 1LL;
for(int i = ; i < N; i++)
fib[i] = (fib[i - ] + fib[i - ]) % P; /* for(int i = 1; i <= 20; i++)
printf("%lld ", fib[i]);
printf("\n"); */ mu[] = ;
for(int i = ; i < N; i++) {
if(!np[i]) pri[++pCnt] = i, mu[i] = -;
for(int j = ; j <= pCnt && i * pri[j] < N; j++) {
np[i * pri[j]] = ;
if(i % pri[j] == ) {
mu[i * pri[j]] = ;
break;
}
mu[i * pri[j]] = -mu[i];
}
} /* for(int i = 1; i <= 20; i++)
printf("%d ", mu[i]);
printf("\n"); */ for(int i = ; i < N; i++) h[i] = 1LL;
for(int i = ; i < N; i++) {
if(!mu[i]) continue;
for(int j = i; j < N; j += i)
h[j] = h[j] * ((mu[i] == ) ? fib[j / i] : inv(fib[j / i])) % P;
} /* for(int i = 1; i <= 20; i++)
printf("%lld ", h[i]);
printf("\n"); */ for(int i = ; i < N; i++)
h[i] = 1LL * h[i] * h[i - ] % P;
} inline int min(int x, int y) {
return x > y ? y : x;
} int main() {
sieve();
for(read(testCase); testCase--; ) {
int n, m; read(n), read(m);
int rep = min(n, m); ll ans = 1LL;
for(int l = , r; l <= rep; l = r + ) {
r = min((n / (n / l)), (m / (m / l)));
ans = ans * pow(h[r] * inv(h[l - ]) % P, 1LL * (n / l) * (m / l) % (P - )) % P;
}
printf("%lld\n", ans);
}
return ;
}

Luogu 3704 [SDOI2017]数字表格的更多相关文章

  1. 洛谷3704 [SDOI2017] 数字表格 【莫比乌斯反演】

    题目分析: 比较有意思,但是套路的数学题. 题目要求$ \prod_{i=1}^{n} \prod_{j=1}^{m}Fib(gcd(i,j)) $. 注意到$ gcd(i,j) $有大量重复,采用莫 ...

  2. luogu P3704 [SDOI2017]数字表格

    传送门 我是真的弱,推式子只能推一半 下面假设\(n<m\) 考虑题目要求的东西,可以考虑每个gcd的贡献,即\[\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{\lfloor ...

  3. BZOJ:4816: [Sdoi2017]数字表格

    4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 501  Solved: 222[Submit][Status ...

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

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

  5. 【BZOJ 4816】 4816: [Sdoi2017]数字表格 (莫比乌斯)

    4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 666  Solved: 312 Description Do ...

  6. P3704 [SDOI2017]数字表格

    P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...

  7. [SDOI2017]数字表格 --- 套路反演

    [SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...

  8. 题解-[SDOI2017]数字表格

    题解-[SDOI2017]数字表格 前置知识: 莫比乌斯反演</> [SDOI2017]数字表格 \(T\) 组测试数据,\(f_i\) 表示 \(\texttt{Fibonacci}\) ...

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

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

随机推荐

  1. linux shell 学习笔记--变量声明与赋值,循环

    Bash 变量是不分类型的 ------------------------ 不像其他程序语言一样,Bash 并不对变量区分"类型".本质上,Bash 变量都是字符串. 但是依赖于 ...

  2. 前端调错看ajax请求操作

    ---------------------------------------------------------------------------------------------------- ...

  3. [独孤九剑]Oracle知识点梳理(二)数据库的连接

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  4. kali_linux学习笔记

    kali linux ssh登陆: 一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAuthentication no ...

  5. 学习动态性能表(11)v$latch$v$latch_children

    学习动态性能表 第十一篇-(1)-V$LATCH  2007.6.7 Oracle Rdbms应用了各种不同类型的锁定机制,latch即是其中的一种.Latch是用于保护SGA区中共享数据结构的一种串 ...

  6. 系列文章--C#即时通讯开发

    对使用UDP协议和大规模即时通讯的思考   C#[Fox即时通讯核心] 开发记录之五 (客户端界面基窗体基本完成)  C#[Fox即时通讯核心] 开发记录之四(服务端多线程异步处理数据 主程序大致结构 ...

  7. poj 2115 C Looooops——exgcd模板

    题目:http://poj.org/problem?id=2115 exgcd裸题.注意最后各种%b.注意打出正确的exgcd板子.就是别忘了/=g. #include<iostream> ...

  8. HL7 标准及实现指南 必看的网址

    V2: http://hl7book.net/index.php?title=HL7_version_2 包括HL7 的介绍,主要章节,每个版本的变化, 各种语言实现的HL7库,免费HL7工具, 最新 ...

  9. C# 常用文件操作

    public class IoHelper { /// <summary> /// 判断文件是否存在 /// </summary> /// <param name=&qu ...

  10. C# 单例模式代码

    原文地址:http://blog.jobbole.com/101746/ 代码一: public sealed class Singleton     {         static Singlet ...