首页 技术 正文
技术 2022年11月19日
0 收藏 664 点赞 4,180 浏览 2932 个字

题解-[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;
}

祝大家学习愉快!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,983
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,500
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,344
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,127
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,761
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,838