列一下式子:

      $\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. Git中从远程的分支获取最新的版本到本地方式

    Git中从远程的分支获取最新的版本到本地方式如下, 如何更新下载到代码到本地,请参阅ice的博客基于Github参与eoe的开源项目指南 方式一 . 查看远程仓库 $ git remote -v eo ...

  2. uoj#87. mx的仙人掌

    //Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++) #define Rep(i, ...

  3. 五、python沉淀之路--字典

    一. 1.根据序列,创建字典,并指定统一的值 v = dict.fromkeys(["],222) print(v) {': 222} 2.根据key 获取值,key不存在时,报错:get方 ...

  4. Nginx理解

    说到反向代理,可能很多人都听说,但具体什么是反向代理,很多人估计就不清楚了.摘一段百度百科上的描述: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后 ...

  5. salt-minion dead but pid file exists 正确解决方法

    说明: 看了网上很多关于alt-minion dead but pid file exists 的解决方法,千篇一律的写一个shell脚本 killproc salt-minion 见链接:http: ...

  6. PHP5之前的构造函数与PHP5之后的构造函数的区别

    在PHP5以前的版本中,构造函数的名称必须与类名相同,这种方法在PHP5中仍然可以使用,但现在已经很少有人用了. PHP5以及之后的版本,构造函数用__construct()方法来声明,这样做的好处是 ...

  7. HDU5469(树的dfs)

    Antonidas Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  8. AngularJS:实例

    ylbtech-AngularJS:实例 1.返回顶部 1. AngularJS 实例 实例 您可以在线编辑实例,然后点击按钮查看结果. AngularJS 实例 <div ng-app=&qu ...

  9. 函数指针的应用学习Demo

    学习函数指针的应用 ,简单demo #include "stdafx.h" #include "SubClass.h"; //函数指针 typedef int ...

  10. Windows_Server_2008远程桌面多用户登陆的配置方法

    开启远程桌面后,Windows Vista(或Windows 2008)下默认只支持一个administrator用户登陆,一个登录后另一个就被踢掉了,下面提供允许同一个用户名同时多个用户登录的配置方 ...