(真不想做莫比乌斯了)

首先根据题意写出式子

i=1~nj=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]数字表格 (反演+逆元)的更多相关文章

  1. BZOJ4816 [Sdoi2017]数字表格 数论 莫比乌斯反演

    原文链接http://www.cnblogs.com/zhouzhendong/p/8666106.html 题目传送门 - BZOJ4816 题意 定义$f(0)=0,f(1)=1,f(i)=f(i ...

  2. BZOJ4816 [Sdoi2017]数字表格 【莫比乌斯反演】

    题目 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生成了 ...

  3. BZOJ4816 SDOI2017 数字表格 莫比乌斯反演

    传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...

  4. 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用老师 ...

  5. bzoj 4816 [Sdoi2017]数字表格——反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4816 \( ans=\prod\limits_{d=1}^{n}f[d]^{\sum\lim ...

  6. BZOJ4816 Sdoi2017数字表格

    一开始只推出O(TN)的做法,后来看了看发现再推一步就好了. 我们只需要枚举gcd就可以啦. 然后我们改变一下枚举顺序 设T为dk 预处理中间那部分前缀积就好了. #include<bits/s ...

  7. 【BZOJ4816】数字表格(莫比乌斯反演)

    [BZOJ4816]数字表格(莫比乌斯反演) 题面 BZOJ 求 \[\prod_{i=1}^n\prod_{j=1}^mf[gcd(i,j)]\] 题解 忽然不知道这个要怎么表示... 就写成这样吧 ...

  8. [SDOI2017]数字表格 --- 套路反演

    [SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...

  9. [Sdoi2017]数字表格 [莫比乌斯反演]

    [Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...

随机推荐

  1. sphinx索引部分源码续——过程:连接到CSphSource对应的sql数据源,通过fetch row取其中一行,然后解析出field,分词,获得wordhit,最后再加入到CSphSource的Hits里

    后面就是初始化一些存储结构,其中重点说下缓存出来的几个临时文件分别的作用.结尾时tmp0的存储的是被上锁的Index,有些Index正在被查询使用 故上锁.tmp1,即对应将来生成的spp文件,存储词 ...

  2. 并不对劲的图论专题(三):SPFA算法的优化

    1.bzoj1489-> 这是个新套路. 我们希望找到最小的x,那么可以二分x,然后判断是否存在圈的边权的平均值小于等于x. 设圈的边权依次为w1,w2,w3,…,wk,平均值为p, 则有p= ...

  3. BZOJ_2286_[Sdoi2011]消耗战_虚树+树形DP+树剖lca

    BZOJ_2286_[Sdoi2011]消耗战_虚树+树形DP Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的 ...

  4. 洛谷 P1344 追查坏牛奶Pollutant Control —— 最小割

    题目:https://www.luogu.org/problemnew/show/P1344 就是求最小割: 但是还要边数最小,所以把边权都*1001+1,这样原来流量部分是*1001,最大流一样的不 ...

  5. pycharm中关于django和buildout的配置

    pycharm提供了对django和buildout的支持,具体的配置如下: 1.django support 在pycharm的settings中修改如下3个选项 1)django project ...

  6. Bootstrap标签页

    用法 您可以通过以下两种方式启用标签页: 通过 data 属性:您需要添加 data-toggle="tab" 或 data-toggle="pill" 到锚文 ...

  7. ES6躬行记(24)——代理和反射

    代理和反射是ES6新增的两个特性,两者之间是协调合作的关系,它们的具体功能将在接下来的章节中分别讲解. 一.代理 ES6引入代理(Proxy)地目的是拦截对象的内置操作,注入自定义的逻辑,改变对象的默 ...

  8. bzoj 3961: [WF2011]Chips Challenge【最小费用最大流】

    参考:https://blog.csdn.net/Quack_quack/article/details/50554032 神建图系列 首先把问题转为全填上,最少扣下来几个能符合条件 先考虑第2个条件 ...

  9. 关于自增id 你可能还不知道

    导读:在使用MySQL建表时,我们通常会创建一个自增字段(AUTO_INCREMENT),并以此字段作为主键.本篇文章将以问答的形式讲述关于自增id的一切. 注: 本文所讲的都是基于Innodb存储引 ...

  10. Luogu P1083 借教室【二分答案/差分】By cellur925

    题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海 ...