题解-[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. UNP——第二章,TCP握手与挥手分析

    1.握手 说明: 下面涉及 FIN,SYN,ACK之类数据时,都是由TCP服务收发, 涉及 accept, listen 之类api,都是 应用进程 完成. 都统一使用 客户端,服务端描述,请自行分辨 ...

  2. sort(hdu oj 1425)计数排序和快速排序

    Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0 < n,m < 1000000),第二行包含n个各不 ...

  3. 搭建zookeeper集群(伪集群)

    jdk环境 上传zk压缩包 解压缩 复制三份 mkdir /usr/local/zk_cluster cp -r zookeeper-3.4.6 /usr/local/zk_cluster/zooke ...

  4. Centos快速安装Docke

    预备 删除旧docker # 删除旧docker $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-co ...

  5. 面试阿里,美团,京东都会被问到的Spring ,从基础到源码帮你全搞定

    1 前言 Spring是一个轻量级开源框架,它是为了解决企业应用开发的复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框 ...

  6. Ubuntu16.04安装搜狗输入法报错:dkpg:处理归档sogoupinyin.deb(--install)时出错,安装sogoupinyin将破坏fcitx-ui-qimpanel

    系统:ubuntu16.04 事件:安装搜狗拼音时报错 报错信息(ubuntu语言是英文的报错信息): dpkg: regarding sogoupinyin_2.3.2.07_amd64-831.d ...

  7. Comparator比较器

    Comparator比较器 简介 为什么写? comparator 是javase中的接口,位于java.util包下,该接口抽象度极高,有必要掌握该接口的使用 大多数文章告诉大家comparator ...

  8. 【ubuntu】搭建mysql5.7

    一.安装mysql (一) 安装mysql 注意别安装8,8配置太高了 $: sudo apt-get install mysql-server or $: sudo apt-get install ...

  9. VMware与Device/Credential Guard不兼容问题

    启动虚拟机vmware突然报不兼容错误 解决方法: 1首先打开控制面板>程序>启动或关闭Windows功能, 取消Hyper-v的勾选 2.在往下划,关闭Windows沙盒的勾选沙盒和虚拟 ...

  10. python接口测试2-开发WEB接口

    首先要安装flask包: pip install flask 开发一个简单的API接口 # 1. 导入包 from flask import Flask, request # 2. 实例化一个 app ...