传送门==在里面====

去年忘记可以预处理了... 然后就打了10pts的暴力... 现在学了莫比乌斯反演就可以来做了


这个题目看着非常的简单, 就是要求这个式子

\[\prod_{i=1}^N\prod_{j=1}^Mf[gcd(i,j)]
\]

这个式子虽然是\(\prod\)而不是\(\sum\), 但是还有个gcd, 我们也可以试着化出一个莫比乌斯反演的形式.

我们按照往常的套路来枚举gcd.

\[ans=\prod_{i=1}^N\prod_{j=1}^M\prod_{d=1}^{min(n,m)}f[d]*b(gcd(i,j)=d)=\prod_{d=1}^Nf[d]\prod_{i=1}^{\left \lfloor \frac Nd\right \rfloor}\prod_{j=1}^{\left \lfloor \frac Md \right \rfloor}b(gcd(i,j)=1)\\=\prod_{d=1}^Nf[d]^{\sum_{i=1}^{\left \lfloor \frac Nd \right \rfloor}\sum_{j=1}^{\left \lfloor \frac Md \right \rfloor}b(gcd(i,j)=1)}
\]

然后指数上这一坨东西我们很熟悉了, 我们得到过一个结论就是

\[\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)=1]=\sum_{x=1}^{min(N,M)}\mu(x)\left \lfloor \frac Nx\right \rfloor\left \lfloor \frac Mx\right \rfloor
\]

所以就有

\[ans=\prod_{d=1}^Nf[d]^{\sum_{x=1}^{min(\left \lfloor \frac Nd \right \rfloor,\left \lfloor \frac Md \right \rfloor)}\mu(x)\left \lfloor \frac N{xd}\right \rfloor\left \lfloor \frac M{xd}\right \rfloor}
\]

然后令\(t=xd\), 就可以化成这个样纸

\[ans=\prod_{t=1}^N\prod_{d|t}f[d]^{{\sum_{\frac td=1}^{min(\left \lfloor \frac Nd \right \rfloor,\left \lfloor \frac Md \right \rfloor)}\mu(\frac td)\left \lfloor \frac Nt\right \rfloor\left \lfloor \frac Mt\right \rfloor}}=\prod_{t=1}^N({\prod_{d|t}f[d]^{{\sum_{\frac td=1}^{min(\left \lfloor \frac Nd \right \rfloor,\left \lfloor \frac Md \right \rfloor)}\mu(\frac td)}})^{\left \lfloor \frac Nt\right \rfloor\left \lfloor \frac Mt\right \rfloor}}
\]

这样括号外面我们会枚举分块, 只要把前缀和改成前缀积就ok了. 但是括号里面呢?

这个形式没见过啊, 好像筛法也没有筛这种东西的.

但是直觉告诉我们里面的这个东西好像不是很大, 可能大约是在\(O(n*log_2\sqrt n)=O(nlogn)\)级别的?

然后事实证明确实是差不多这样的(luogu题解里面说大约是15n左右), 所以我们做一波预处理就ok了.

这样总复杂度似乎差不多就是\(O(n+nlogn+q\sqrt n)\)的, 不知道算的对不对..大概写O(能过)会更科学一点??

然后就是代码了...

#include <cmath>
#include <cstdio>
const int N=1e6+6;
const int P=1e9+7;
int prime[N],mu[N],f[N],g[N],F[N],tot;
bool notp[N];
inline int gn(int a=0,char c=0){
for(;c<'0'||c>'9';c=getchar());
for(;c>47&&c<58;c=getchar())a=a*10+c-48;return a;
}
template<class T>
inline T min(const T&a,const T&b){
return a<b?a:b;
}
inline int qpow(int a,int b,int s=1){
for(;b;b>>=1,a=1LL*a*a%P)
if(b&1) s=1LL*s*a%P;
return s;
}
void shai(int n){
f[1]=mu[1]=notp[1]=F[0]=F[1]=1;
for(int i=2;i<=n;++i){
f[i]=(f[i-1]+f[i-2])%P; F[i]=1;
if(!notp[i])prime[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*prime[j]<n;++j){
int k=i*prime[j]; notp[k]=1;
if(i%prime[j]==0){mu[k]=0;break;}
else mu[k]=-mu[i];
}
}
for(int i=1;i<=n;++i)
for(int j=i;j<=n;j+=i)
if(mu[j/i]) F[j]=1LL*F[j]*(mu[j/i]==1?f[i]:qpow(f[i],P-2))%P;
for(int i=2;i<=n;++i)
F[i]=1LL*F[i-1]*F[i]%P;
}
int solve(int n,int m){
int ans=1,last,mn=min(n,m);
for(int i=1;i<=mn;i=last+1){
last=min(n/(n/i),m/(m/i));
ans=1LL*ans*qpow(1LL*F[last]*qpow(F[i-1],P-2)%P,
1LL*(n/i)*(m/i)%(P-1))%P;
}
return (ans%P+P)%P;
}
int main(){ shai(1e6);
int T=gn(),m,n;
while(T--)
n=gn(),m=gn(),
printf("%d\n",solve(n,m));
}

哦 对了 还有一件事就是根据费马小定理, \(G^{(P-1)}\equiv1(mod\ p)\), 所以外面的指数对\((p-1)\)取模就好了...

【学术篇】SDOI2017 数字表格的更多相关文章

  1. 题解-[SDOI2017]数字表格

    题解-[SDOI2017]数字表格 前置知识: 莫比乌斯反演</> [SDOI2017]数字表格 \(T\) 组测试数据,\(f_i\) 表示 \(\texttt{Fibonacci}\) ...

  2. BZOJ:4816: [Sdoi2017]数字表格

    4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 501  Solved: 222[Submit][Status ...

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

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

  4. 【BZOJ 4816】 4816: [Sdoi2017]数字表格 (莫比乌斯)

    4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 666  Solved: 312 Description Do ...

  5. P3704 [SDOI2017]数字表格

    P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...

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

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

  7. [SDOI2017]数字表格 & [MtOI2019]幽灵乐团

    P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...

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

  9. [SDOI2017]数字表格

    Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...

随机推荐

  1. cut 从/a/b/c/d/e获取/a/b/c

    https://www.cnblogs.com/chenxiaomeng/p/10066821.html two_dir=`echo /a/b/c/d/e/f | cut -d"/" ...

  2. socket API CSocket CAsyncSocket 用法及区别

    要进行网络编程就要和Socket打交道,Socket有同步阻塞方式和异步非阻塞方式两种使用,事实上同步和异步在我们编程的生涯中可能遇到了很多,而Socket也没什么特别.虽然同步好用,不费劲,但不能满 ...

  3. NIO 源码分析(02-1) BIO 源码分析

    目录 一.BIO 最简使用姿势 二.ServerSocket 源码分析 2.1 相关类图 2.2 主要属性 2.3 构造函数 2.4 bind 方法 2.5 accept 方法 2.6 总结 NIO ...

  4. JUC源码分析-集合篇:并发类容器介绍

    JUC源码分析-集合篇:并发类容器介绍 同步类容器是 线程安全 的,如 Vector.HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去创 ...

  5. wangEditor 图片上传失败提示

    wangEditor 官网自定义上传事件:https://www.kancloud.cn/wangfupeng/wangeditor2/123689 声明:我用的wangEditor版本是2.1.23 ...

  6. LVS DR模拟实验

    准备多台服务器,现以三台服务器为例第一台做调度器 192.168.200.111[root@localhost ~]# iptables -F[root@localhost ~]# setenforc ...

  7. windows 修改远程登录端口号

    运行regedit.exe打开注册表编辑器,即在cmd的dos窗口输入regedit命令 找到如下注册表子项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\ ...

  8. 【胡策篇】题解 (UOJ 192 + CF938G + SPOJ DIVCNT2)

    和泉纱雾与烟花大会 题目来源: UOJ 192 最强跳蚤 (只改了数据范围) 官方题解: 在这里哦~(说的很详细了 我都没啥好说的了) 题目大意: 求树上各边权乘积是完全平方数的路径数量. 这种从\( ...

  9. Python学习笔记(八)——正则表达式

    正则表达式 \d表示匹配一个数字 例如,1\d\d可以匹配以1开头的三位数字 \w可以匹配一个字母或者数字 例如,\d\w可以匹配12,1A等 .可以匹配任意字符 例如,py.表示pyc.pya等 * ...

  10. 微信小程序之自定义组件

    在微信小程序项目中 肯定会存在很多功能和样式上相似的部分 面对这种情况 只是单单的ctrl+c ctrl+v 就显得很low了,而且也不便于后期维护那么这时候 使用微信小程序中的自定义组件功能就很合适 ...