[SDOI2017]数字表格 --- 套路反演
[SDOI2017]数字表格
由于使用markdown的关系
我无法很好的掌控格式,见谅
对于这么简单的一道题竟然能在洛谷混到黑,我感到无语
\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]数字表格 --- 套路反演的更多相关文章
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- BZOJ4816 SDOI2017 数字表格 莫比乌斯反演
传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...
- BZOJ.4816.[SDOI2017]数字表格(莫比乌斯反演)
题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 这个好像简单些啊,只要不犯sb错误 [Update] 真的算反演中比较裸的题了... \(Descriptio ...
- 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演
题目描述 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生 ...
- [bzoj4816][Sdoi2017]数字表格 (反演+逆元)
(真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...
- BZOJ 4816 [Sdoi2017]数字表格 ——莫比乌斯反演
大力反演出奇迹. 然后xjb维护. 毕竟T1 #include <map> #include <ctime> #include <cmath> #include & ...
- 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)}\),多组询问, ...
- [SDOI2017]数字表格 & [MtOI2019]幽灵乐团
P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
随机推荐
- 【BZOJ】3262: 陌上花开
[题意]三维偏序,给定n个点(x,y,z),求每个点和(0,0,0)组成空间中的点数,有重点.1<=x,y,z<=2*10^5,1<=n<=10^5. [算法]CDQ分治+树状 ...
- 【BZOJ】2631: tree LCT
[题意]给定n个点的树,每个点初始权值为1,m次操作:1.x到y的点加值,2.断一条边并连一条边,保证仍是树,3.x到y的点乘值,4.x到y的点权值和取模.n,m<=10^5. [算法]Link ...
- 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)
题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
- webpack编译报错:Module not found: Error: Cannot resolve 'file' or 'directory' ./../../node_modules..
在同事的mac电脑上,可以正常编译,拿到我这边就出错了(⊙﹏⊙) 好像是webpack在window下的一个bug,需要让 webpack 和你的项目保持在一个盘符下,参考. 解决方法: 修改conf ...
- 好久没写了,SQLSERVER服务丢失后怎么办
服务器突然中了病毒,查杀后,结果两个服务也丢了, 从其他机器上COPY了两个EXE过来,编写这两个服务就搞定了,不用重装MSSQL2005了 sc create MSSQLSERVER binpath ...
- 33、求按从小到大的顺序的第N个丑数
一.题目 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 二.解法 ...
- 微信小程序开发定制
上海软件定制专家:http://www.dzonly.com/?from=timeline
- Django 1.10文档中文版Part4
2.10 高级教程:如何编写可重用的apps 2.10.1 重用的概念 The Python Package Index (PyPI)有大量的现成可用的Python库.https://www.djan ...
- beego学习笔记(3)
相对复杂一点的示例: package main import "github.com/astaxie/beego" type MainController struct{ beeg ...
- beego学习笔记(2)
BEEGO的几个特点: 简单化 RESTful 支持.MVC 模型,可以使用 bee 工具快速地开发应用,包括监控代码修改进行热编译.自动化测试代码以及自动化打包部署. 智能化 支持智能路由.智能监控 ...