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 ...
随机推荐
- 201621123014《Java程序设计》第七周学习总结
1. 本周学习总结 1.1 思维导图:Java图形界面总结 答: 1.2 可选:使用常规方法总结其他上课内容. 答:1.Swing组件主要分为容器组件和其他组件. 2.JFrame和JPanel都可以 ...
- localtime 和 localtime_r 的区别
转自:http://blog.csdn.net/maocl1983/article/details/6221810 #include <cstdlib> #include <iost ...
- golang实现模拟键盘按键
公司前段时间要我写个小项目需要可以局域网内一个ipad控制另一台pc上的键盘输入,github上找了找,居然有个robotgo库这么神级的存在,感觉go的库真是越来越多了,虽然大部分都是第三方的.ht ...
- HDU4416Good Article Good sentence(后缀自动机)
Problem Description In middle school, teachers used to encourage us to pick up pretty sentences so t ...
- LeetCode Maximum Distance in Arrays
原题链接在这里:https://leetcode.com/problems/maximum-distance-in-arrays/description/ 题目: Given m arrays, an ...
- python+rabbitmq实现分布式
#master # -*- coding: utf-8 -*-import sys#reload(sys)sys.setdefaultencoding("utf-8") impor ...
- git常用命令备忘录
返回未修改状态 [git checkout . --没有的提交的,都返回到原来的状态 git clean -xdf 删除文件和目录] git checkout . && git cl ...
- WPF基本概念入门
关于数据类型,有原子类型,列表类型,字典类型等等,而wpf对应控件有contentControl,itemsControl,headerItemsControl等. 控件和类型一一对应,控件和类型之间 ...
- linux上安装gitolite和windows上安装tortoisegit及msysgit
1 quick install+setup for experts If your Unix-fu and ssh-fu are good, just copy your ssh public key ...
- laravel的小坑
写控制器的名的时候只能出现一个首写大写字母, 后面的都为小写字母 否则会报找不到该控制器的错误