[洛谷]P3704-数字表格

妙啊,这又是一道反演题,而且个人感觉比较高级

传送门


大意

在\(N\times M\)的数表\(a\)中,\(a_{i,j}\)表示f((i,j)),其中\((i,j)\)表示\(i\)和\(j\)的最大公约数,\(f\)为\(fibnaci\)数列

求$$\prod_{i=1}N\prod_{j=1}M a_{i,j}$$


那么显然这又是一个褪柿子的题QwQ,于是我们可以开心的推这个奇怪的柿子


为了便于书写,我们令\(N<=M\)

\[\prod_{i=1}^N\prod_{j=1}^M\prod_{d=1}^N[(i,j)==d]f(d)
\]

稍微换下位置,有

\[\prod_{d=1}^Nf(d)\prod_{i=1}^N\prod_{j=1}^M[(i,j)==d]
\]

也就是说\(f(d)\)被乘了后面这么多次

\[\prod_{d=1}^Nf(d)^{\sum_{i=1}^N\sum_{j=1}^M[(i,j)==d]}
\]


指数上的柿子是个非常经典了老问题了,我们小小的复习一下

令$$f(d)={\sum_{i=1}N\sum_{j=1}M[(i,j)==d]}$$

这里的\(f(d)\)与原问题中的\(f\)不重合,只是我们中间推理用的字母。

设$$F(n)=\sum_{n|d} f(d)$$,则有

\[F(n)=\lfloor\frac{N}{n}\rfloor\lfloor\frac{M}{n}\rfloor
\]

反演一下

\[f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)
\]

往一开始的柿子上看,显然指数就为\(f(d)\)

\[f(d)=\sum_{d|k}\mu(\frac{k}{d})\lfloor\frac{N}{k}\rfloor\lfloor\frac{M}{k}\rfloor
\]

更换求和指标,我们枚举\(\frac{k}{d}\)

\[\sum_{t=1}^n\mu(t)\lfloor\frac{N}{td}\rfloor\lfloor\frac{M}{td}\rfloor
\]

这就差不多了,我们带回初始柿子。


\[Ans=\prod_{d=1}^Nf(d)^{\sum_{t=1}^n\mu(t)\lfloor\frac{N}{td}\rfloor\lfloor\frac{M}{td}\rfloor}
\]

考虑把这个\(\sum\)拽下来(为什么能这么做呢,因为你考虑,\(a^{x+y}=a^x\times a^y\),所以这个\(sigma\)拽下来也没啥影响

\[Ans=\prod_{d=1}^N\prod_{t=1}^{\frac{n}{d}}f(d)^{\mu(t)\lfloor\frac{N}{td}\rfloor\lfloor\frac{M}{td}\rfloor}
\]

更换下求和指标,我们枚举\(td=T\)

\[\prod_{T=1}^N\prod_{t|T}f(t)^{\mu(\frac{T}{t})\lfloor\frac{N}{T}\rfloor\lfloor\frac{M}{T}\rfloor}
\]

发现这个大概可能是整出分块,但是中间的东西比较棘手,我们把一些东西提出来

\[\prod_{t|T}f(t)^{\mu(\frac{T}{t})}
\]

发现这个东西没法线筛,那我们直接暴力算他,每一次计算为\(log_n\),把这块东西叫做\(g(t)\)

就有

\[\prod_{T=1}^N g(T)^{\lfloor\frac{N}{T}\rfloor\lfloor\frac{M}{T}\rfloor}
\]


这个东西就可以\(O(n)\)的做了,但是该死的出题人还有多组数据,考虑整除分块

发现我们可以预处理\(g(T)\)的前缀积,用\(\frac{P[r]}{P[l-1]}\)就能求出区间积了

注意有取模,\(\mu\)的取值可能有\(-1\),所以要预先求出\(f(t)\)的逆元,整除分块的时候也要求出\(P[l-1]\)的逆元

细节方面关于\(exp\)的参数一定要用\(long long\),因为\(\lfloor\frac{N}{T}\rfloor\lfloor\frac{M}{T}\rfloor\)这个会爆\(int\)

而且洛谷这样的不会显示\(RE\),而是\(MLE\)(手动黑人问号脸),就很难搞


上代码

#include<bits/stdc++.h>
using namespace std;
const int Mod=1000000007,
maxn=1000010;
typedef long long LL;
int n,m;
LL ans; LL exp(LL b,LL p){
if (p==1) return b%Mod;
LL temp=exp(b,p>>1);
temp=(LL)(temp*temp)%Mod;
if (p&1) temp=((LL)temp*(b%Mod))%Mod;
return temp;
} int mu[maxn],vis[maxn],pri[maxn];
LL f[maxn],F[maxn];//f->fibonaci; F:f & Mod _ Ni Yuan
int cnt=0; inline void getmiu(LL n){
mu[1]=1;vis[1]=1;F[1]=1;cnt=0;
f[0]=0;f[1]=1;
for (int i=2;i<=n;i++){
f[i]=(f[i-1]+f[i-2])%Mod;
F[i]=exp(f[i],Mod-2);
if (!vis[i]){
mu[i]=-1;
pri[++cnt]=i;
}
for (int j=1;j<=cnt&(LL)i*pri[j]<=n;j++){
vis[i*pri[j]]=1;
if (i%pri[j]==0) break;
else mu[i*pri[j]]=-mu[i];
}
}
} inline int read()
{
char s;
int k=0,base=1;
while((s=getchar())!='-'&&s!=EOF&&!(isdigit(s)));
if(s==EOF)exit(0);
if(s=='-')base=-1,s=getchar();
while(isdigit(s)){k=k*10+(s^'0');s=getchar();}
return k*base;
} LL g[maxn];//g[T]=\prod _{t|T}f(t)^{\mu(\frac{T}{t})}
inline void solve(LL n){
for (int i=0;i<=n;i++) g[i]=1;
for (int i=1;i<=n;i++){
for (int j=i;j<=n;j+=i){//枚举i的倍数
if (!mu[j/i]) continue;
if (mu[j/i]==1) g[j]=(LL)g[j]*f[i]%Mod;
else if (mu[j/i]==-1) g[j]=(LL)g[j]*F[i]%Mod;
}
}
//for (LL i=1;i<=100;i++) prLLf("%d %d %d\n",f[i],F[i],g[i]);
for (int i=2;i<=n;i++) g[i]=(LL)g[i-1]*g[i]%Mod;
} int main(){
int t=read();
getmiu(1000000);
solve(1000000);
//for (LL i=1;i<=100;i++) prLLf("%d\n",g[i]);
while (t--){
n=read();m=read();
ans=1;
for (int l=1,r;l<=min(n,m);l=r+1){
r=min(n/(n/l),m/(m/l));
LL delta=g[r]*exp(g[l-1],Mod-2)%Mod;
ans=(LL)ans*exp(delta,(LL)(n/l)*(m/l))%Mod;
}
printf("%lld\n",ans);
}
}

[洛谷]P3704-数字表格的更多相关文章

  1. bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格

    洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...

  2. 洛谷P1118 数字三角形游戏

    洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...

  3. 洛谷P1553 数字翻转(升级版)

    题目链接 https://www.luogu.org/problemnew/show/P1553 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的 ...

  4. 洛谷 P5660 数字游戏 & [NOIP2019普及组]

    传送门 洛谷改域名了QAQ 解题思路 没什么好说的,一道红题,本不想发这篇博客 ,但还是尊重一下CCF吧QAQ,怎么说也是第一年CSP呢! 用getchar一个个读入.判断.累加,最后输出即可. 不过 ...

  5. 洛谷P3704 [SDOI2017]数字表格

    题目描述 Doris刚刚学习了fibonacci数列.用f[i]f[i] 表示数列的第ii 项,那么 f[0]=0f[0]=0 ,f[1]=1f[1]=1 , f[n]=f[n-1]+f[n-2],n ...

  6. 洛谷 P3704 [SDOI2017]数字表格(莫比乌斯函数)

    题面传送门 题意: 求 \[\prod\limits_{i=1}^n\prod\limits_{j=1}^mfib_{\gcd(i,j)} \] \(T\) 组测试数据,\(1 \leq T \leq ...

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

    传送门 yyb大佬太强啦…… 感觉还是有一点地方没有搞懂orz //minamoto #include<cstdio> #include<iostream> #include& ...

  8. 洛谷 P3704 SDOI2017 数字表格

    题意: 给定两个整数 \(n, m\),求: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m \operatorname{Fib}_{\gcd\left(n, m\righ ...

  9. 洛谷 P1118 数字三角形游戏 Label:dfs

    题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一 ...

随机推荐

  1. css随堂笔记(三)

    Css随堂笔记(三) 1 关于背景图片   A 设置背景图片:background-image:url(“图片的路径”):   B 背景图片位置: background-position:1 方位名词 ...

  2. 通知:即日起本博客暂停更新,请移步至yanxin8.com获取最新文章

    通知:即日起本博客暂停更新,请移步至yanxin8.com与博主交流及获取最新文章

  3. Android XMPP 例子(Openfire+asmack+spark) 出现登陆连接错误

    Android XMPP 例子(Openfire+asmack+spark) 运行出来没问题,但是登陆的时候出现如下错误: 出现错误: 09-17 15:24:16.388: E/AndroidRun ...

  4. Mysql 服务无法启动解决办法

    1.我使用的是MySQL-5.7.10-winx64 版本,在安装后启动服务时出现 “服务无法启动”错误 2.解决办法为删除安装目录中的data文件,然后打开cmd调到自己的安装目录下输入mysqld ...

  5. gamemakerstudio:加载精灵

    如果精灵图片不是单一图片(拥有子图)可以称它为长条图,当gamemakerstudio加载这类精灵图片时,我们给图片名字命名为*_strip列数.*,这样当加载图片时gamemakerstudio会自 ...

  6. spark包

    spark-assembly-1.5.2-hadoop2.6.0.jar http://blog.csdn.net/ronaldo4511/article/details/53035494 http: ...

  7. Android学习——SharedPreferences

    接下来的几个博文,来介绍安卓中的数据存储方式,安卓中的数据存储主要有四种方式: 1.SharedPreferences 2.SQLite 3.Content Provider 4.File 这篇博文主 ...

  8. Linux文件压缩和解压缩命令

    Linux文件压缩和解压缩命令: tar 命令(打包并压缩的话,原文件也会默认存在) -c 建立打包档案 -x 解包 -t 查看包里的类容 -r 向包里追加文件 -v 显示打包过程 -f 文件 比如: ...

  9. 如何清理Windows缩略图缓存?

    从Win95的IE4开始就有缩略图缓存了,缩略图缓存作用主要是用于存储Windows资源管理器缩略图图像文件.这加快了图像的显示速度,因为每次用户查看文件夹时都不需要重新生成这些较小的图像.缩略图缓存 ...

  10. 长大Tips的第一步

    任务进度:登陆界面的初步设计. 运行环境:windows10 编译环境:netbeans 编写语言:java 界面展示: 任务简介: 本次任务指示简单的完成了界面设计,登陆按钮暂未实现,持续更新中,敬 ...