[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;
}
[bzoj4816][Sdoi2017]数字表格 (反演+逆元)的更多相关文章
- BZOJ4816 [Sdoi2017]数字表格 数论 莫比乌斯反演
原文链接http://www.cnblogs.com/zhouzhendong/p/8666106.html 题目传送门 - BZOJ4816 题意 定义$f(0)=0,f(1)=1,f(i)=f(i ...
- 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= ...
- bzoj4816 [Sdoi2017]数字表格
Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...
- bzoj 4816 [Sdoi2017]数字表格——反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4816 \( ans=\prod\limits_{d=1}^{n}f[d]^{\sum\lim ...
- BZOJ4816 Sdoi2017数字表格
一开始只推出O(TN)的做法,后来看了看发现再推一步就好了. 我们只需要枚举gcd就可以啦. 然后我们改变一下枚举顺序 设T为dk 预处理中间那部分前缀积就好了. #include<bits/s ...
- 【BZOJ4816】数字表格(莫比乌斯反演)
[BZOJ4816]数字表格(莫比乌斯反演) 题面 BZOJ 求 \[\prod_{i=1}^n\prod_{j=1}^mf[gcd(i,j)]\] 题解 忽然不知道这个要怎么表示... 就写成这样吧 ...
- [SDOI2017]数字表格 --- 套路反演
[SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
随机推荐
- Apache POI组件操作Excel,制作报表(三)
Apache POI组件操作Excel,制作报表(三) 博客分类: 探索实践 ExcelApache算法Office单元测试 上一篇介绍了POI组件操作Excel时如何对单元格和行进行设置, ...
- 六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法
1. id和instancetype类型, id和instancetype类型区别: 1. id和instancetype都可以用来作为方法的返回值 2. id可以用来定义类型,instancetyp ...
- 并不对劲的hdu4777
Long long ago, there was an ancient rabbit kingdom in the forest. Every rabbit in this kingdom was n ...
- python的for...in...if...语句
Python中,for...[if]...语句一种简洁的构建List的方法,从for给定的List中选择出满足if条件的元素组成新的List,其中if是可以省略的.下面举几个简单的例子进行说明. &g ...
- Node 基本使用
node -v:查看node版本 npm -v:查看npm版本 npm install npm -g :升级npm版本 npm install <module_name> [-g]:安装指 ...
- java数组与字符串相互转换、整型与字符串相互转换【详解】
java 数组->字符串 1.char数组(字符数组)->字符串 可以通过:使用String.copyValueOf(charArray)函数实现. 举例: char[] arr={ ...
- app 后台程序设计
限制客户端一分钟之内访问接口的次数 1.设备的唯一标识获取这个实际上IOS7后会存在问题,权限已经收回了,android可以2.唯一标识可以通过生成一个token区分3.每分钟的频率可以这样设置 ke ...
- [App Store Connect帮助]八、维护您的 App(4.2)查看评分与评论
您可以查看 App 的总评分或单个顾客评论.如有必要,您可以针对某条评论报告问题. [注]顾客可以为您的 iOS 和 macOS App 评分并撰写评论,但只能为 Apple TVOS App 评分. ...
- (图论)51NOD 1298 圆与三角形
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). 输入 第1行:一个数T, ...
- PHP简单实现单点登录功能示例
1.准备两个虚拟域名 127.0.0.1 www.openpoor.com127.0.0.1 www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...