洛谷3704 [SDOI2017] 数字表格 【莫比乌斯反演】
题目分析:
比较有意思,但是套路的数学题。
题目要求$ \prod_{i=1}^{n} \prod_{j=1}^{m}Fib(gcd(i,j)) $.
注意到$ gcd(i,j) $有大量重复,采用莫比乌斯反演。可以写成:
$ \prod_{i=1}^{min(n,m)}Fib(i)^{\sum_{i|d}\mu(\frac{d}{i})\lfloor \frac{n}{d}\rfloor\lfloor \frac{m}{d}\rfloor} $.
更进一步的,我们可以发现幂是一个求和,那么把求和依次提出,再重新组合在一起,就变成了:
$ \prod_{i=1}^{min(n,m)}(\prod_{i|d}Fib(i)^{\mu(\frac{d}{i})})^{\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor} $.
可以发现最外层的积的下标是$ i $或$ d $对答案没有影响,原因我们可以考虑当下标是$ i $的时候,它会对它的每个倍数产生影响,而倍数的影响是不论$ i $的。所以对于每个倍数我们同样可以枚举因数,式子可以写成:
$ \prod_{d=1}^{min(n,m)}(\prod_{i|d}Fib(i)^{\mu(\frac{d}{i})})^{\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor} $.
注意这个式子,它的里层是一个只与当前的$ d $有关的式子,而外层是一个典型的分块。那么我们预处理出里面的情况并做前缀积,外面再采用分块,这道题就可以顺利解决。
对于里面的式子,我们需要$ O(nlog{n}) $进行预处理,而每个询问我们可以分块解决,单次询问的时间复杂度是$ O(\sqrt{n}log{n}) $所以时间复杂度是$O(nlog{n}+T\sqrt{n}log{n})$.
注意到这题没有用到斐波那契数列的任何性质,所以函数$ Fib(x) $可以改成任意其它函数。
代码:
#include<bits/stdc++.h>
using namespace std; const int mod = ;
const int maxn = ; const int N = ; int n,m;
int Fib[maxn],Inv[maxn];
int MFib[maxn],MInv[maxn]; int flag[maxn],prime[maxn>>],mu[maxn],num; int fast_pow(int now,long long pw){
int z = now,ans = ;long long im = ;
while(im <= pw){
if(im & pw) ans = (1ll*ans*z)%mod;
z = (1ll*z*z)%mod; im <<= ;
}
return ans;
} void GetMiu(){
flag[] = ;mu[] = ;
for(int i=;i<=N;i++){
if(!flag[i]) prime[++num] = i,mu[i] = -;
for(int j=;j<=num&&i*prime[j]<=N;j++){
flag[i*prime[j]] = ;
if(i % prime[j] == ) {mu[i*prime[j]] = ;break;}
else mu[i*prime[j]] = -mu[i];
}
}
} void init(){
GetMiu();
Fib[] = ; Fib[] = ;
for(int i=;i<=N;i++) Fib[i] = (Fib[i-]+Fib[i-])%mod;
for(int i=;i<=N;i++) Inv[i] = fast_pow(Fib[i],mod-);
for(int i=;i<=N;i++) MFib[i] = ;
for(int i=;i<=N;i++){
for(int j=;i*j<=N;j++){
if(mu[j] == ) continue;
if(mu[j] == ) MFib[i*j] = (1ll*MFib[i*j]*Fib[i])%mod;
else MFib[i*j] = (1ll*MFib[i*j]*Inv[i])%mod;
}
}
for(int i=;i<=N;i++) MFib[i] = (1ll*MFib[i]*MFib[i-])%mod;
for(int i=;i<=N;i++) MInv[i] = fast_pow(MFib[i],mod-);
} void work(){
int res = ;
for(int i=;i<=min(n,m);){
int nxt = min(n/(n/i),m/(m/i));
long long z1 = 1ll*(n/i)*(m/i);
res = (1ll*res*fast_pow((1ll*MFib[nxt]*MInv[i-])%mod,z1))%mod;
i = nxt+;
}
printf("%d\n",res);
} int main(){
init();
int T; scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
work();
}
return ;
}
洛谷3704 [SDOI2017] 数字表格 【莫比乌斯反演】的更多相关文章
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- 【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 数字表格 莫比乌斯反演
传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...
- bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格
洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...
- 洛谷P3704 [SDOI2017]数字表格(莫比乌斯反演)
传送门 yyb大佬太强啦…… 感觉还是有一点地方没有搞懂orz //minamoto #include<cstdio> #include<iostream> #include& ...
- 洛谷 P3704 [SDOI2017]数字表格(莫比乌斯函数)
题面传送门 题意: 求 \[\prod\limits_{i=1}^n\prod\limits_{j=1}^mfib_{\gcd(i,j)} \] \(T\) 组测试数据,\(1 \leq T \leq ...
- 洛谷P3704 [SDOI2017]数字表格
题目描述 Doris刚刚学习了fibonacci数列.用f[i]f[i] 表示数列的第ii 项,那么 f[0]=0f[0]=0 ,f[1]=1f[1]=1 , f[n]=f[n-1]+f[n-2],n ...
- BZOJ.4816.[SDOI2017]数字表格(莫比乌斯反演)
题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 这个好像简单些啊,只要不犯sb错误 [Update] 真的算反演中比较裸的题了... \(Descriptio ...
- BZOJ 4816 [Sdoi2017]数字表格 ——莫比乌斯反演
大力反演出奇迹. 然后xjb维护. 毕竟T1 #include <map> #include <ctime> #include <cmath> #include & ...
随机推荐
- 【asp.net core mvc + angular6实战】 - 1. 环境搭建
为什么打算写这些文章? 没有为什么,只是为了学习Angular和更了解.Net Core等技术 需要用到的技术? 后端使用.Net Core 2.1 + EF Core 2.1 + Mysql 5.7 ...
- MySQL root密码忘记,原来还有更优雅的解法!
一直以来,对于MySQL root密码的忘记,以为只有一种解法-skip-grant-tables. 问了下群里的大咖,第一反应也是skip-grant-tables.通过搜索引擎简单搜索了下,无论是 ...
- .NetCore 资料分享
.NetCore3.0 你还不打算入手么? 这次主要是推荐一些自己学习中遇到的一些好的资料和自己的看法( 我推荐的都是我看过的 Asp.Net Core 不做介绍了,直接分享资料了 资料: .NetC ...
- IIS 日志导入到数据库的方法
使用微软Log Parser 执行 logparser "SELECT * FROM d:\iislogs\u_ex18071705.log TO myTableName" -o: ...
- 几何学观止(Lie群部分)
上承这个页面,这次把Lie群的部分写完了 几何学观止-微分几何部分(20181102).pdf 我觉得其他部分(尤其是代数几何部分)我目前没有把握写得令自己满意,总之希望在毕业前能写完吧. 这次调整了 ...
- 二次剩余 Cipolla算法
欧拉准则 \(a\)是\(p\)的二次剩余等价于\(a^{\frac{p-1}{2}}\equiv 1\pmod p\),\(a\)不是\(p\)的二次剩余等价于\(a^{\frac{p-1}{2}} ...
- Oja’s rule
目录 Oja's rule 背景 Hebbian learning 主要的一些理论 论文里面一些主要的假设 引理1 引理2 引理3 定理1 LEMMA 3(ALL) 引理 4 定理 2 定理 3(关于 ...
- sso单点登录系统(解决session共享)
场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...
- 蒲公英App开发之检测新版本
https://www.jianshu.com/p/2d3f048511d7 2017.04.17 16:22* 字数 62 阅读 422评论 0喜欢 1 可以在App内部实现检测版本更新并实现安装. ...
- echarts使用笔记三:柱子对比
app.title = '坐标轴刻度与标签对齐'; option = { title : { //标题 x : 'center', y : 5, text : '对比图' //换行用 \n }, le ...