首页 > 其他分享 >P3704 [SDOI2017]数字表格——莫比乌斯反演

P3704 [SDOI2017]数字表格——莫比乌斯反演

时间:2023-01-03 21:23:17浏览次数:43  
标签:lfloor limits int dfrac P3704 mu 反演 SDOI2017 prod

莫比乌斯反演

\(\color{red}{f(n)=\sum\limits_{d|n}}g(d) \Leftrightarrow g(n)=\sum\limits_{d|n}\mu(d)f(\dfrac{n}{d})\)

例题:P3704 [SDOI2017]数字表格

题意:给出 \(n,m\),求 \(\prod\limits^n_{i=1}\prod\limits^m_{j=1}f(gcd(i,j))\)

\(f(k)\) 表示第 \(k\) 项斐波那契数。数据 \(n,m\le 10^6,T=10^3,P=10^9+7\)

推导:

最终得出的式子:\(\prod^n_{T=1}(\prod^n_{d=1}f(d)^{\mu(\dfrac{T}{d})})^{\lfloor\dfrac{n}{T}\rfloor\lfloor\dfrac{m}{T}\rfloor}\)

令 \(F(T)=\prod\limits^n_{d=1}f(d)^{\mu(\dfrac{T}{d})}\)

\(\prod\limits^n_{T=1}F(T)^{\left\lfloor\dfrac{n}{T}\right\rfloor\left\lfloor\dfrac{m}{T}\right\rfloor}\)

那么这个式子处理起来也比较困难,对于 \(\mu(\dfrac{T}{d})\) 可能出现 \(-1\) 所以需要预处理逆元;对于 \(\left\lfloor\dfrac{n}{T}\right\rfloor\left\lfloor\dfrac{m}{T}\right\rfloor\) 这两个东西直接数论分块加快速幂;数列递推就好;单次循环的乘积,由于 \(n\) 不大,直接枚举就好;双次循环的乘积需要预处理前缀积,小心逆元!

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define P 1000000007
#define N 1000010
int mu[N], p[N], vis[N], cnt;
int f[N], g[N], F[N];
// f是斐波那契数列

int qpow(int a, int b)
{
    int res = 1;
    while (b)
    {
        if (b & 1)
            res = 1ll * res * a % P;
        a = 1ll * a * a % P;
        b >>= 1;
    }
    return res;
}
void init()
{
    mu[1] = 1;
    for (int i = 2; i < N; ++i)
    {
        if (!vis[i])
            p[++cnt] = i, mu[i] = -1;
        for (int j = 1; i * p[j] < N; ++j)
        {
            vis[i * p[j]] = 1;
            if (i % p[j] == 0)
                break;
            mu[i * p[j]] = -mu[i];
        }
    }
    f[1] = g[1] = F[0] = F[1] = 1;
    for (int i = 2; i < N; ++i)
    {
        f[i] = (f[i - 1] + f[i - 2]) % P;// 预处理fib
        g[i] = qpow(f[i], P - 2);// 逆元
        F[i] = 1;
    }
    for (int i = 1; i < N; ++i)
        for (int j = i; j < N; j += i)
            if (mu[j / i])
                F[j] = 1ll * F[j] * (mu[j / i] == 1 ? f[i] : g[i]) % P;
    for (int i = 2; i < N; ++i)
        F[i] = 1ll * F[i] * F[i - 1] % P; // 前缀积
}
int calc(int n, int m)
{
    if (n > m)
        swap(n, m);// 推理是建立在n<m上的,理当交换位置
    int r, s, ans = 1;
    for (int l = 1; l <= n; l = r + 1)
    {
        r = min(n / (n / l), m / (m / l));
        s = 1ll * F[r] * qpow(F[l - 1], P - 2) % P; // 区间积
        ans = 1ll * ans * qpow(s, 1ll * (n / l) * (m / l) % (P - 1)) % P;
    }
    return ans;
}
int main()
{
    init();
    int T, n, m;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d%d", &n, &m);
        printf("%d\n", calc(n, m));
    }
}

这是我学会的第一道黑题,虽说是课上讲的,但是真理解了,在此纪念下。

标签:lfloor,limits,int,dfrac,P3704,mu,反演,SDOI2017,prod
From: https://www.cnblogs.com/CYLSY/p/17023398.html

相关文章

  • 狄利克雷卷积和莫比乌斯反演初探(施工中)
    0.前置知识瞅这1.狄利克雷卷积定义定义域为\(\mathbb{N_+}\)的函数称为数论函数。对于两个数论函数\(f,g\),其狄利克雷卷积为\(h(n)=\sum\limits_{d\midn}f(d)......
  • 莫比乌斯反演草稿纸
    这只小蒟蒻做莫比乌斯反演的练习题时用$\LaTeX$打了一些草稿,又不舍得扔掉,于是放在这个博客里供大家欣(tu)赏(cao)。P2257YY的GCD$$\text{求}\sum_{x=1}^n\sum_{y=1}^m[g......
  • HDU 6439 2018CCPC网络赛 Congruence equationI(杜教筛 + 莫比乌斯反演 + 伯努利数)
      大致题意:给你一个长度为k的序列a。对于序列c,当  时,;当时,取[0,m)中任意一个数字。令  表示满足  的序列c的方案数。现在让你求 。          ......
  • 莫比乌斯反演
    莫比乌斯函数 设正整数$x=p_1^{c_1}p_2^{c_2}...p_m^{c_m}$,定义函数 $\left(\begin{array}{ccc}1&2&3\\4&5&6\\7&8&9\\0&0&0\end{array}\right)$......
  • 拉格朗日反演学习记录
    \(\texttt{updating……}\)多项式复合对于多项式\(F(x),G(x)\),其复合为:\(F(G(x))=\sum_{i}[x^i]F(x)G(x)^i\)求法:设\(B=\sqrtn\)\[\begin{aligned}\sum_{i=0}^n[x......
  • 杂谈:二项式反演与多步容斥
    这是两个本质不同的东西。多步容斥是“至少或至多选若干个”到“恰好选若干个”的变换。而二项式反演是“钦定选若干个”到“恰好选若干个”的变换。二项式反演虽然形式上......
  • 一种关于子集异或和的冷门反演
    前言本文用集合的符号表示二进制数。具体地,定义全集\(u\)是\(2^n-1\),某个二进制数\(x\)第\(t\)位是1可以理解为为\(x\)中有\(t\)号元素,否则没有。定义\(|x|......
  • 反演与筛法
    本文大量参考了:《反演与筛法》马耀华OI中(?)常用数论函数求和法的大致描述、zzt求和法的简化版,negiizhao1积性函数与反演我们先给出一些关于数论函数的基本定义。......
  • Möbius 反演
    \(\textbf{QAQ}\)令\(h\)为两个数论函数\(f,g\)的Dirichlet卷积\(f*g\),则\[h(n)=\sum_{d|n}f(d)g(\frac{n}{d})\]它满足结合律,交换律,分配律。Dirichlet卷积单......
  • 容斥原理 & 莫比乌斯反演
    tobefix:“扩展”部分的式子是假的二维子集反演莫比乌斯反演容斥原理&莫比乌斯反演一、函数卷积:定义函数卷积\(f(x,y)\)和\(g(x,y)\)是\(X\timesX\ri......