Luogu 3704 [SDOI2017]数字表格
列一下式子:
$\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]数字表格的更多相关文章
- 洛谷3704 [SDOI2017] 数字表格 【莫比乌斯反演】
题目分析: 比较有意思,但是套路的数学题. 题目要求$ \prod_{i=1}^{n} \prod_{j=1}^{m}Fib(gcd(i,j)) $. 注意到$ gcd(i,j) $有大量重复,采用莫 ...
- luogu P3704 [SDOI2017]数字表格
传送门 我是真的弱,推式子只能推一半 下面假设\(n<m\) 考虑题目要求的东西,可以考虑每个gcd的贡献,即\[\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{\lfloor ...
- BZOJ:4816: [Sdoi2017]数字表格
4816: [Sdoi2017]数字表格 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 501 Solved: 222[Submit][Status ...
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- 【BZOJ 4816】 4816: [Sdoi2017]数字表格 (莫比乌斯)
4816: [Sdoi2017]数字表格 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 666 Solved: 312 Description Do ...
- P3704 [SDOI2017]数字表格
P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...
- [SDOI2017]数字表格 --- 套路反演
[SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...
- 题解-[SDOI2017]数字表格
题解-[SDOI2017]数字表格 前置知识: 莫比乌斯反演</> [SDOI2017]数字表格 \(T\) 组测试数据,\(f_i\) 表示 \(\texttt{Fibonacci}\) ...
- [SDOI2017]数字表格 & [MtOI2019]幽灵乐团
P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...
随机推荐
- Agc019_C Fountain Walk
传送门 题目大意 给定网格图上起点和终点每个格子是长为$100$米的正方形,你可以沿着线走. 平面上还有若干个关键点,以每个关键点为圆心,$10$为半径画圆,表示不能进入圆内的线,但是可以从圆周上走, ...
- hdu 1937 Finding Seats
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 第六篇 VIM你值得拥有!
vim 是一个具有很多命令的功能非常强大的编辑器.限于篇幅,在本教程当中 就不详细介绍了.本教程的设计目标是讲述一些必要的基本命令,而掌握好这 些命令,您就能够很容易将vim当作一 ...
- git公钥生成以及与coding等联合
更好用的 https://segmentfault.com/a/1190000002645623 其中 $ ssh -T git@github.comgitbub $ ssh -T git@git.c ...
- Admin.Admin/Login --- 后台项目中的管理员及登录模块
管理员模块: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
- Boost.Asio基本原理(CSDN也有Markdown了,好开森)
Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...
- 【转】LTE基本架构
这篇文章主要介绍LTE的最基础的架构,包括LTE网络的构成,每一个网络实体的作用以及LTE网络协议栈,最后还包括对一个LTE数据流的模型的说明. LTE网络参考模型 这是一张非常有名的LTE架构图,从 ...
- pom.xm首行报错Failure to transfer org.codehaus.plexus:plexus-components:pom:1.1.20
从SVN导出一个Maven项目,pom.xml首行报错: Failure to transfer org.codehaus.plexus:plexus-components:pom:1.1.20 fr ...
- 查看,修改ceph节点的ceph配置命令
标签(空格分隔): ceph,ceph运维,ceph配置 查看ceph配置 1. 查看ceph默认配置: # ceph --show-config 2. 查看 type.num 的ceph默认配置: ...
- Python函数(三)-局部变量
全局变量 全局变量在函数中能直接访问 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" name = 'John' def te ...