题解-[SDOI2017]数字表格

前置知识:

莫比乌斯反演</>


[SDOI2017]数字表格

\(T\) 组测试数据,\(f_i\) 表示 \(\texttt{Fibonacci}\) 数列第 \(i\) 项(\(f_0=0\),\(f_1=1\),\(f_i=f_{i-1}+f_{i-2}\)),求

\[\left(\prod\limits_{i=1}^n\prod\limits_{j=1}^mf_{\gcd(i,j)}\right)\bmod(10^9+7)
\]

数据范围:\(T\le 1000\),\(1\le n,m\le 10^6\)。


本来是水题,但是这个蒟蒻一下犯了好多常见毛病,所以来写篇题解。

  1. 忘记用生成 \(\mu\) 的线性筛函数了。

  2. 忘记幂次取模要膜 \(\varphi(mod)\) 了。


假设 \(n\le m\):

\[\begin{split}
g(n,m)=&\prod\limits_{i=1}^n\prod\limits_{j=1}^mf_{\gcd(i,j)}\\
=&\prod\limits_{d=1}^nf_d^{\sum\limits_{i=1}^n\sum\limits_{j=1}^m[\gcd(i,j)=d]}\\
=&\prod\limits_{d=1}^nf_d^{\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}[\gcd(i,j)=1]}\\
=&\prod\limits_{d=1}^nf_d^{\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor\frac md\rfloor}\sum\limits_{k|\gcd(i,j)}\mu(k)}\\
=&\prod\limits_{d=1}^nf_d^{\sum\limits_{k=1}^{\lfloor\frac nd\rfloor}\mu(k)\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}[k|i]\sum\limits_{j=1}^{\lfloor\frac md\rfloor}[k|j]}\\
=&\prod\limits_{d=1}^nf_d^{\sum\limits_{k=1}^{\lfloor\frac nd\rfloor}\mu(k)\lfloor\frac{n}{dk}\rfloor\lfloor\frac{m}{dk}\rfloor}\\
\end{split}
\]

然后现在直接分块套分块 \(\Theta(N+Tn)\) 可以得到 \(30\) 分。


为了 \(\texttt{AC}\),只好拿 \(T=dk\) 带入继续走:

\[\begin{split}
g(n,m)=&\prod\limits_{d=1}^nf_d^{\sum\limits_{k=1}^{\lfloor\frac nd\rfloor}\mu(k)\lfloor\frac{n}{dk}\rfloor\lfloor\frac{m}{dk}\rfloor}\\
=&\prod\limits_{d=1}^nf_d^{\sum\limits_{k=1}^{\lfloor\frac nd\rfloor}\mu(k)\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}\\
=&\prod\limits_{T=1}^n\prod\limits_{d|T}f_d^{\mu(\frac{T}{d})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}\\
=&\prod\limits_{T=1}^n\left(\prod\limits_{d|T}f_d^{\mu(\frac{T}{d})}\right)^{\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor}\\
\end{split}
\]

然后括号外面就 \(\Theta(\sqrt n)\) 分块,里面就 \(\Theta(N\log N)\) 预处理出来。

最后时间复杂度:\(\Theta(N\log N+T\sqrt n)\)。


code

#include <bits/stdc++.h>
using namespace std; //&Start
#define lng long long
#define lit long double
#define kk(i,n) " \n"[i==n]
const int inf=0x3f3f3f3f;
const lng Inf=0x3f3f3f3f3f3f3f3f; //&Data
const int N=1e6,mod=1e9+7;
int t,n,m; //&Pow
int Pow(int a,int x){
int res=1;
for(;x;a=1ll*a*a%mod,x>>=1)
if(x&1) res=1ll*res*a%mod;
return res;
} //&Mobius&Fibonacci
bitset<N+10> np;
int p[N+10],cnt,mu[N+10],tp[N+10],f[N+10],g[N+10],h[N+10];
void Mobius(){
np[1]=true;
mu[1]=f[1]=g[1]=h[1]=1;
for(int i=2;i<=N;i++){
if(!np[i]) p[++cnt]=i,mu[i]=-1;
f[i]=(f[i-1]+f[i-2])%mod;
g[i]=Pow(f[i],mod-2);
h[i]=1;
for(int j=1;j<=cnt&&i*p[j]<=N;j++){
np[i*p[j]]=1;
if(i%p[j]==0){mu[i*p[j]]=0;break;}
mu[i*p[j]]=-mu[i];
}
}
for(int k=1;k<=N;k++){ //nlogn 的暴力筛
if(mu[k]==0) continue;
for(int T=k;T<=N;T+=k)
h[T]=1ll*h[T]*(mu[k]==1?f[T/k]:g[T/k])%mod;
}
h[0]=1;
for(int i=1;i<=N;i++) h[i]=1ll*h[i-1]*h[i]%mod;//前缀积
} //&Main
int main(){
Mobius();//这东西千万不能忘记打
scanf("%d",&t);
for(int ti=1;ti<=t;ti++){
scanf("%d%d",&n,&m);
if(n>m) n^=m^=n^=m;
int res=1,a,x;
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
a=1ll*h[r]*Pow(h[l-1],mod-2)%mod;
x=1ll*(n/l)*(m/l)%(mod-1);//幂次一定一定一定要模(phi(mod))
res=1ll*res*Pow(a,x)%mod;
}
printf("%d\n",res);
}
return 0;
}

祝大家学习愉快!

题解-[SDOI2017]数字表格的更多相关文章

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

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

  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]数字表格

    Link #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1e6; in ...

  8. P3704 [SDOI2017]数字表格 (莫比乌斯反演)

    [题目链接] https://www.luogu.org/problemnew/show/P3704 [题解] https://www.luogu.org/blog/cjyyb/solution-p3 ...

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

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

随机推荐

  1. Java初始化静态变量的时间顺序

    1. 开始吧! 今天,我们来探讨交流下静态变量初始化过程.Java虚拟机在类加载期间也同样遵循这个过程. 2. 初始化过程 在较高的层次上,JVM执行以下步骤: 首先,加载并链接类.然后,这个过程的& ...

  2. 基于docker部署ceph以及修改docker image

    前言 容器和ceph的结合已经在一些生产环境当中做了尝试,容器的好处就是对运行环境的一个封装,传统的方式是集成为ISO,这个需要一定的维护量,而容器的相关操作会简单很多,也就有了一些尝试,个人觉得如果 ...

  3. javascript布局转换

    javascript布局转换是将原有的浮动布局通过JS里面的javascript属性 offsetLeft 和offsetTop默认值来给元素设置绝对定位. 原来的:缺点--我们想给网页中的图片添加拖 ...

  4. Pinpoint 更改agentid 和 agent name 长度限制(Pinpoint系列二)

    本文基于 Pinpoint 2.1.0 版本 本文的内容为了更改 ID 和 Name 长度限制,因为有使用容器或者是服务名称确实比较长,所以根据业务场景,我们需要更改源码来实现这个. 具体更改,参考 ...

  5. Springboot 框架整理,建议做开发的都看看,整理的比较详细!

    什么是 Spring Boot? SpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品,是用来简化 spring 初始搭建和开 ...

  6. 深度分析:Java中如何如理异常,一篇帮你搞定!

    异常的背景 初识异常 我们曾经的代码中已经接触了一些 "异常" 了. 例如: 除以 0 System.out.println(10 / 0); // 执行结果 Exception ...

  7. Guitar Pro 7教程之如何导入吉他谱

    在前面的章节小编为大家也讲解了不少关于Guitar Pro 的相关教程,譬如{cms_selflink page='index' text='Guitar Pro下载'},安装等等一系列的使用教程,前 ...

  8. 如何使用MathType输入贝塔符号?

    在文档中使用公式,常常需要输入各种符号.比如要输入三角函数公式,那么就要输入三角函数中的阿尔法α.贝塔β等符号,那么要怎么打出这类符号呢? MathType作为强大的数学公式编辑器,可以用来编辑各种数 ...

  9. 「CF578F」 Mirror Box

    description CF578F solution 考虑转化题目的要求 1.对于任意一条边,都存在一条从界垂直射入的光线,经过反射穿过这条边. 当图中有环时,环内的边一定不满足条件,而在不存在环时 ...

  10. Java基础教程——BigDecimal类

    BigDecimal类 float.double类型的数字在计算的时候,容易发生精度丢失. 使用java.math.BigDecimal类可以解决此类问题. 前面讲过Math类,现在的BigDecim ...