[洛谷]P3704-数字表格

[洛谷]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);
    }
}

转载于:https://www.cnblogs.com/ugly-CYW-lyr-ddd/p/9253270.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值