题目链接

Description

分析:

∏i=1n∏j=1mf(gcd(i,j))∏i=1n∏j=1mf(gcd(i,j))

\prod_{i=1}^{n}\prod_{j=1}^{m}f(gcd(i,j))

对于这种式子,一般我们会枚举gcd(每个f值要使用几次)
设g(d)=∑ni=1∑mj=1[gcd(i,j)=d]g(d)=∑i=1n∑j=1m[gcd(i,j)=d]g(d)=\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=d]

∏d=1min(n,m)f(d)g(d)∏d=1min(n,m)f(d)g(d)

\prod_{d=1}^{min(n,m)}f(d)^{g(d)}

把∑ni=1∑mj=1[gcd(i,j)=d]∑i=1n∑j=1m[gcd(i,j)=d]\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=d]用反演化开

g(d)=∑k=1min(n/d,m/d)nkdmkdμ(k)g(d)=∑k=1min(n/d,m/d)nkdmkdμ(k)

g(d)=\sum_{k=1}^{min(n/d,m/d)}{n \over kd}{m \over kd}μ(k)

∏d=1min(n,m)f(d)∑k=1nkdmkdμ(k)∏d=1min(n,m)f(d)∑k=1nkdmkdμ(k)

\prod_{d=1}^{min(n,m)}f(d)^{\sum_{k=1}{n \over kd}{m \over kd}μ(k)}

像我这种naive的选手,到这里就直接做了

继续,我们看看g(d)g(d)g(d)能不能进一步优化,设T=kdT=kdT=kd

g(d)=∑k=1min(n/d,m/d)nkdmkdμ(k)=∑d|TnTmTμ(Td)g(d)=∑k=1min(n/d,m/d)nkdmkdμ(k)=∑d|TnTmTμ(Td)

g(d)=\sum_{k=1}^{min(n/d,m/d)}{n \over kd}{m \over kd}μ(k)=\sum_{d|T}{n \over T}{m \over T}μ({T \over d})

这样我们就可把TTT的枚举拉出来

∏d=1min(n,m)f(d)∑d|TnTmTμ(Td)" role="presentation">∏d=1min(n,m)f(d)∑d|TnTmTμ(Td)∏d=1min(n,m)f(d)∑d|TnTmTμ(Td)

\prod_{d=1}^{min(n,m)}f(d)^{\sum_{d|T}{n \over T}{m \over T}μ({T \over d})}

∏d=1min(n,m)∏d|Tf(d)nTmTμ(Td)∏d=1min(n,m)∏d|Tf(d)nTmTμ(Td)

\prod_{d=1}^{min(n,m)}\prod_{d|T}f(d)^{{n \over T}{m \over T}μ({T \over d})}

枚举顺序换一下

∏T=1min(n,m)∏d|Tf(d)nTmTμ(Td)=∏T=1min(n,m)(∏d|Tf(d)μ(Td))nTmT∏T=1min(n,m)∏d|Tf(d)nTmTμ(Td)=∏T=1min(n,m)(∏d|Tf(d)μ(Td))nTmT

\prod_{T=1}^{min(n,m)}\prod_{d|T}f(d)^{{n \over T}{m \over T}μ({T \over d})}=\prod_{T=1}^{min(n,m)}(\prod_{d|T}f(d)^{μ({T \over d})})^{{n \over T}{m \over T}}

发现对于每个TTT,∏d|Tf(d)μ(Td)" role="presentation" style="position: relative;">∏d|Tf(d)μ(Td)∏d|Tf(d)μ(Td)\prod_{d|T}f(d)^{μ({T \over d})}的值是固定的,与nnn和m" role="presentation" style="position: relative;">mmm无关,于是我们先用筛法预处理出每个TTT对应的这个式子的值,前缀积一下
而外面这一层∏T=1min(n,m)()nTmT" role="presentation" style="position: relative;">∏min(n,m)T=1()nTmT∏T=1min(n,m)()nTmT\prod_{T=1}^{min(n,m)}()^{{n \over T}{m \over T}}可以分块处理
所以时间复杂度:O((max(n,m)+T(n−−√+m−−√))logMOD)O((max(n,m)+T(n+m))logMOD)O((max(n,m)+T(\sqrt n+\sqrt m))logMOD)

tip

∏d|Tf(d)μ(Td)∏d|Tf(d)μ(Td)\prod_{d|T}f(d)^{μ({T \over d})}直接暴力处理即可
设sumsumsum为前缀积,注意sum[0]=1sum[0]=1sum[0]=1

一开始预处理就慢到爆,怀疑人生
KSM次数多了也费时,所以我们预处理f的逆元,减少KSM的调用
因为要计算f(d)μ(Td)f(d)μ(Td)f(d)^{μ({T \over d})},而μμ<script type="math/tex" id="MathJax-Element-1569">μ</script>的取值只有-1,1,所以预处理f的逆元反而比较方便

多%防爆ll

还是免不了T掉了

ll改int,计算过程中强转ll

时间就少了一半诶

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long longusing namespace std;const int N=1000000;
const ll p=1e9+7;
int sshu[N+5],tot=0,mu[N+5],n,m;
int f[N+5],sum[N+5],inv[N+5];
bool no[N+5];inline int KSM(int a,int b) {int t=1;a%=p;while (b) {if (b&1) t=(1LL*t*a)%p;b>>=1;a=(1LL*a*a)%p;}return t%p;
}void prepare() {    mu[1]=1;for (int i=2;i<=N;i++) {if (!no[i]) {sshu[++tot]=i;mu[i]=-1;}for (int j=1;j<=tot&&sshu[j]*i<=N;j++) {no[sshu[j]*i]=1;if (i%sshu[j]==0) {mu[sshu[j]*i]=0;break;}mu[sshu[j]*i]=-mu[i];}}f[0]=0; f[1]=1; sum[0]=1; sum[1]=1;                               //前缀积inv[1]=1;                                         //f的逆元 for (int i=2;i<=N;i++) f[i]=(f[i-1]+f[i-2])%p,inv[i]=KSM(f[i],p-2),sum[i]=1;for (int i=1;i<=N;i++) if (mu[i]!=0) {for (int j=1;j*i<=N;j++)                  // j*i=T i=T/d j=dif (mu[i]>0) sum[j*i]=(1LL*sum[j*i]*f[j])%p;else sum[j*i]=(1LL*sum[j*i]*inv[j])%p;}for (int i=2;i<=N;i++) sum[i]=(1LL*sum[i]*sum[i-1])%p;
}int main()
{prepare();int T;scanf("%d",&T);while (T--) {scanf("%d%d",&n,&m);int last,ans=1;for (int i=1;i<=min(n,m);i=last+1) {last=min(n/(n/i),m/(m/i));ans=1LL*ans%p*KSM(1LL*sum[last]*KSM(sum[i-1],p-2)%p,1LL*(n/i)*(m/i)%(p-1))%p;}printf("%d\n",ans%p);}return 0;
}

bzoj4816 [Sdoi2017]数字表格(反演)相关推荐

  1. [bzoj4816][Sdoi2017]数字表格 (反演+逆元)

    (真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...

  2. SDOI2017 数字表格

    SDOI2017 数字表格 题意: 题目传送门 题解: 答案的式子大致是这样的: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m f_{gcd(i, j)}\] 然后大力反 ...

  3. 【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 ...

  4. 并不对劲的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 ...

  5. 【BZOJ4816】数字表格,反演+枚举约数

    传送门 思路: 考场上没怎么卡常,只有60分,感觉自己宛如一个zz 先说一下60分做法 设n≤mn\leq m 随便化出来∏d=1nf(d)S(⌊nd⌋,⌊md⌋)\displaystyle\prod ...

  6. BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 \(Description\) 用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\) ...

  7. 「luogu3704」[SDOI2017]数字表格

    莫比乌斯反演,其中一些处理比较套路 1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 co ...

  8. [SDOI2017]数字表格

    题目描述 Doris刚刚学习了fibonacci数列.用$f[i]$ 表示数列的第$i$ 项,那么 $f[0]=0$ ,$f[1]=1$ , $f[n]=f[n-1]+f[n-2],n\geq 2$ ...

  9. BZOJ 4816 [Sdoi2017]数字表格

    题目链接 https://lydsy.com/JudgeOnline/problem.php?id=4816 题解 反演 ∏T=1min⁡(n,m)(∏d∣Tfib(d)μ(d))⌊n/d⌋⌊m/d⌋ ...

  10. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

最新文章

  1. Camera开发系列之六-使用mina框架实现视频推流
  2. 解决开启服务器防火墙导致ftp不能连接的问题
  3. C语言图形界面的编程
  4. linux——文件输入输出管理
  5. .Net Core建站(2):EF Core+CodeFirst数据库迁移
  6. 如何优化代码节约系统资源解决重复实例化对象的问题——神奇的单例模式(C#设计模式)...
  7. 参会邀请 - CCKS2020 | 2020全国知识图谱与语义计算大会(CCKS2020)明日开幕
  8. 排序-概述,插入排序(180602更新完毕)
  9. java爬虫出发onclick事件_java爬虫(五)利用selenium 模拟点击获取动态页面的内容...
  10. 埃氏筛法(求n以内有多少个素数)
  11. snmpwalk 命令_Snmpwalk命令行示例
  12. 一文搞懂 Flink如何移动计算
  13. python爬取头条付费专栏视频_用Python编写爬取头条视频的代码
  14. python做图片美化_Python实现简单的照片磨皮(照片智能磨皮) 最新免费版
  15. 费雪分离定理的证明与评价
  16. 【IT圈内事】2019互联网企业100强
  17. MyBatis面试题库
  18. 28python成功输出腾讯位置大数据北京地区迁出数据
  19. 甘特图控件VARCHART XGantt的功能亮点
  20. MySQL中对敏感字段值进行加密存储

热门文章

  1. 关于获取3DS MAX中的蒙皮数据 3DSMAX C++API的应用
  2. VMware Workstation的安装
  3. 用手机玩转GIS!这些你常用的GIS软件竟然都有手机版
  4. 无线路由器的AP、Client、WDS、WISP使用功能图解(清晰明了)
  5. 光纤跳线接口_光纤认证测试——光纤跳线设置基准(一跳线法)
  6. [应用抓包] r0capture应用层通用抓包使用文档
  7. python 类和对象的实例简介
  8. 集成混合运动与大功率柔性操作的半人马救灾机器人(4)——项目成果展示
  9. HTML meta 标签的使用方式总结(本文总结17中使用方式)
  10. 计算机论文英语单词,英语单词