[bzoj4816][Sdoi2017]数字表格 (反演+逆元)
(真不想做莫比乌斯了)
首先根据题意写出式子
∏(i=1~n)∏(j=1~m)f[gcd(i,j)]
很明显的f可以预处理出来,解决
根据套路分析,我们可以先枚举gcd(i,j)==d
∏(d=1~n)f[d]......后面该怎么写?
我们发现前面式子中i,j为连乘,而对于相同的gcd,就可以变成f[d]的几次幂!
则∏(d=1~n)f[d]Σ(i=1~n/d)Σ(j=1~m/d)[gcd(i,j)==1]
然后就可以开心的反演了
∏(d=1~n)f[d]Σ(i=1~n/d)Σ(j=1~m/d)[gcd(i,j)==1]
=∏(d=1~n)f[d]Σ(i=1~n/d)Σ(j=1~m/d)Σ(k|i&&k|j)μ(k)
(接下来,我们先枚举k)
=∏(d=1~n)f[d]Σ(k=1~n)μ[k](n/kd)(m/kd)
(先枚举kd=D)
=∏(D=1~n)∏(d|D)f[d]μ[D/d](n/D)(m/D)
=∏(D=1~n)(∏(d|D)f[d]μ[D/d])(n/D)(m/D)
至此反演结束
再来观察这个式子,我们发现∏(d|D)f[d]μ[D/d]是关于D的一个函数,我们可以把它的前缀积处理出来,复杂度O(n*log(n))
处理过程中,当μ[D/d]==-1时需要除法,所以需要求逆元,而对于1e9+7这个素数,f[i]对于1e9+7的逆元为pow(f[i],mod-2)
在求解时我们需要取一段的前缀积,所以还需要把前缀积的逆元处理出来,方法同上
逆元处理复杂度O(n*log(n))
在求解时结合数论分块和快速幂,复杂度O(T*sqrt(n)*log(n))
总复杂度O(n*log(n)+T*sqrt(n)*log(n))
这道题做的时候主要卡在把变成Σ并变成指数,在此做个标记
后续有优化可以把求逆元的复杂度干掉
具体参考这篇博客
AC代码
#include<cstdio> #include<iostream> #define ll long long #define re register const int mod=1e9+7; using namespace std; int p[500010],top;bool v[1000010];short mu[1000010];ll f[1000010],ni[1000010],tot[1000010]; inline ll pow(ll a,ll b){re ll ans=1;for(;b;b>>=1){if(b&1) (ans*=a)%=mod;(a*=a)%=mod;}return ans; } int main(){mu[1]=1;f[1]=1;ni[1]=1;tot[1]=1;for(int i=2;i<=1000000;i++)f[i]=(f[i-1]+f[i-2])%mod,ni[i]=pow(f[i],mod-2),tot[i]=1;for(int i=2;i<=1000000;i++){if(!v[i]){p[++top]=i;mu[i]=-1;}for(int j=1;j<=top&&p[j]*i<=1000000;j++){v[i*p[j]]=1;if(!(i%p[j])) break;mu[i*p[j]]=-mu[i];}}for(int i=1;i<=1000000;i++){for(re int j=1;j*i<=1000000;j++)if(mu[j]==-1) (tot[j*i]*=ni[i])%=mod;else if(mu[j]==1) (tot[j*i]*=f[i])%=mod;}tot[0]=1;for(int i=1;i<=1000000;i++) (tot[i]*=tot[i-1])%=mod;ni[0]=1;for(re int i=1;i<=1000000;i++)ni[i]=pow(tot[i],mod-2);re int t,n,m,x;re ll ans;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);ans=1;if(n>m) swap(n,m);for(int i=1;i<=n;i=x+1){x=min((n/(n/i)),(m/(m/i)));(ans*=pow(tot[x]*ni[i-1]%mod,1ll*(n/i)*(m/i)))%=mod;}printf("%lld\n",ans);}return 0; }
View Code
转载于:https://www.cnblogs.com/mikufun-hzoi-cpp/p/11013959.html
[bzoj4816][Sdoi2017]数字表格 (反演+逆元)相关推荐
- SDOI2017 数字表格
SDOI2017 数字表格 题意: 题目传送门 题解: 答案的式子大致是这样的: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m f_{gcd(i, j)}\] 然后大力反 ...
- 【bzoj4816】[Sdoi2017]数字表格
题目链接 Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Dor ...
- 【BZOJ4816】数字表格,反演+枚举约数
传送门 思路: 考场上没怎么卡常,只有60分,感觉自己宛如一个zz 先说一下60分做法 设n≤mn\leq m 随便化出来∏d=1nf(d)S(⌊nd⌋,⌊md⌋)\displaystyle\prod ...
- 并不对劲的bzoj4816:loj2000:p3704[SDOI2017]数字表格
题目大意 有函数\(f(x)\),\(f(0)=0,f(1)=1,f(x)=f(x-1)+f(x-2)\) \(t\)(\(t\leq1000\))组询问,每次给定\(n,m\)(\(n,m\leq1 ...
- BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)
题目链接 \(Description\) 用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\) ...
- BZOJ 4816 [Sdoi2017]数字表格
题目链接 https://lydsy.com/JudgeOnline/problem.php?id=4816 题解 反演 ∏T=1min(n,m)(∏d∣Tfib(d)μ(d))⌊n/d⌋⌊m/d⌋ ...
- 「luogu3704」[SDOI2017]数字表格
莫比乌斯反演,其中一些处理比较套路 1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 co ...
- [SDOI2017]数字表格
题目描述 Doris刚刚学习了fibonacci数列.用$f[i]$ 表示数列的第$i$ 项,那么 $f[0]=0$ ,$f[1]=1$ , $f[n]=f[n-1]+f[n-2],n\geq 2$ ...
- BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...
最新文章
- opencv实现图片HDR功能
- ASP.NET 导出EXCEL
- js 停止事件冒泡 阻止浏览器的默认行为
- 【产品分析】Microsoft MyPhone试用手记
- Windows Server 笔记之网络负载平衡(NLB)和服务质量(QoS)简介
- H.266 参考软件VTM下载和安装
- 使用JPA和@NamedQueries的Spring数据
- 网络流 (网络流问题汇总)
- HandlerInterceptor SpringMVC拦截器
- 前端调用后端接口 xhr 只看到一次 实际调用两次_持续演进的接口自动化测试方案...
- OpenCV-绘制箭头cv::arrowedLine
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_4字符输出流的基本使用_写出单个字符...
- 使用lockf()保证应用单进程
- 水务信息化数据整合系统方案分析
- HDU 5025 Saving Tang Monk
- 手机邮箱如何申请注册?163邮箱申请哪个好?
- 第十六届—振兴杯计算机网络管理员决赛模拟题
- CRM和SCRM,到底有什么区别?
- amc 美国数学竞赛能用计算机吗,关于AMC美国数学竞赛的QA
- JSON--就是键值对