题解-[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\)。
本来是水题,但是这个蒟蒻一下犯了好多常见毛病,所以来写篇题解。
忘记用生成 \(\mu\) 的线性筛函数了。
忘记幂次取模要膜 \(\varphi(mod)\) 了。
假设 \(n\le m\):
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\) 带入继续走:
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]数字表格的更多相关文章
- [SDOI2017]数字表格 & [MtOI2019]幽灵乐团
P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...
- BZOJ:4816: [Sdoi2017]数字表格
4816: [Sdoi2017]数字表格 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 501 Solved: 222[Submit][Status ...
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- 【BZOJ 4816】 4816: [Sdoi2017]数字表格 (莫比乌斯)
4816: [Sdoi2017]数字表格 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 666 Solved: 312 Description Do ...
- P3704 [SDOI2017]数字表格
P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...
- [SDOI2017]数字表格 --- 套路反演
[SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...
- 【题解】[SDOI2017]数字表格
Link #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1e6; in ...
- P3704 [SDOI2017]数字表格 (莫比乌斯反演)
[题目链接] https://www.luogu.org/problemnew/show/P3704 [题解] https://www.luogu.org/blog/cjyyb/solution-p3 ...
- 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演
题目描述 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生 ...
随机推荐
- fork函数拓展
1.fork之后父子进程共享文件:文件引用计数的值改变,共享偏移. 在下面的例子中test.txt为parentchil.如果子进程没有睡眠,两个进程交叉执行,内容不可预测. 1 #include&l ...
- EF Core 一、重识 EF
重识EF EF Core 学习资料:https://docs.microsoft.com/zh-cn/ef/core/dbcontext-configuration/ 本为作为EF Core学习的开始 ...
- EDI在服装行业的应用
EDI发展迅速,从最初应用于汽车.物流.零售等行业开始,应用范围不断扩大.当下金融行业.服装行业也加入到使用EDI进行数据传输的队伍中.本文主要介绍服装行业通过EDI系统实现业务数据收发,本次EDI项 ...
- 利用HUtool读取Excel内容
// 1.获取上传文件输入流 InputStream inputStream = null; try{ inputStream = file.getInputStream(); }catch (Exc ...
- Function(函数分享)第二节
一.类型注解 1.1 类型注解 函数的类型注解分为两个部分:参数类型注解和返回值类型注解.其中返回值类型注解有时候我们可以直接省略,因为Typescript可以根据返回的语句来自动判断出返回值的类型. ...
- HttpClient4.5X使用-集成微服务
HttpClient4.5X使用-集成微服务 1.什么是HttpClient HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直 ...
- Linux中Python自动输入sudo 密码
一.背景和需求 背景: 由于docker服务进程都是以root帐号的身份运行的,所以用docker跑abpred出来的文件所有者都是root, 而我作为一般用户,操作这个文件不够权限,运行代码时需要s ...
- 微软开源的 AI 工具,让旧照片焕发新生
原文地址:Bringing Old Photos Back to Life 原文作者:Ziyu Wan 译者 & 校正:HelloGitHub-小鱼干 & 鸭鸭 写在前面 在 GitH ...
- php form表单提交时,action url中参数无效的解决方法
表单提交时get方式的一个错误 <form class="form-inline pull-right" method="get" action=&quo ...
- Linux中进程杀掉总是自动重启
<1> cat /proc/进程id/status 找到该子进程对应的父进程,将其父进