首页 > 其他分享 >BZOJ3309 DZY Loves Math

BZOJ3309 DZY Loves Math

时间:2023-09-04 09:22:47浏览次数:53  
标签:lfloor right frac sum times DZY BZOJ3309 Math left

题目大意

对于正整数 \(n\),定义 \(f(n)\) 为 \(n\) 所包含质因子的最大幂指数。例如 \(f(1960)=f(2^3 \times 5^1 \times 7^2)=3\),\(f(10007)=1\),\(f(1)=0\)。

给定正整数 \(a,b\),求下式的值:

\[\sum^{a}_{i=1}\sum^{b}_{j=1}f(\gcd(i,j)) \]

推导

首先记 \(n=\min(a,b),m=\max(a,b)\)。

\[\begin{aligned} & \ \ \ \ \ \ \sum^{a}_{i=1}\sum^{b}_{j=1}f(\gcd(i,j)) \\ &= \sum^{n}_{d=1}f(d)\sum^{n}_{i=1}\sum^{m}_{j=1}\left[ \gcd(i,j)=d \right] \\ &= \sum^{n}_{d=1}f(d)\sum^{\left\lfloor \frac{n}{d} \right\rfloor}_{i=1}\sum^{\left\lfloor \frac{m}{d} \right\rfloor}_{j=1}\left[ \gcd(i,j)=1 \right] \\ &= \sum^{n}_{d=1}f(d)\sum^{\left\lfloor \frac{n}{d} \right\rfloor}_{i=1}\sum^{\left\lfloor \frac{m}{d} \right\rfloor}_{j=1}\sum_{t \mid \gcd(i,j)}\mu(t) \\ &= \sum^{n}_{d=1}f(d)\sum^{\left\lfloor \frac{n}{d} \right\rfloor}_{i=1}\sum^{\left\lfloor \frac{m}{d} \right\rfloor}_{j=1}\sum_{t \mid i \land t \mid j}\mu(t) \\ &= \sum^{n}_{d=1}f(d) \sum^{\left\lfloor \frac{n}{d} \right\rfloor}_{t =1}\mu(t) \sum^{\left\lfloor \frac{n}{d} \right\rfloor}_{i=1} \left[ t \mid i \right] \sum^{\left\lfloor \frac{m}{d} \right\rfloor}_{j=1} \left[ t \mid j \right] \\ &= \sum^{n}_{d=1}f(d)\sum^{\left\lfloor \frac{n}{d} \right\rfloor}_{t=1}\mu(t) \left\lfloor \frac{n}{dt} \right\rfloor \left\lfloor \frac{m}{dt} \right\rfloor \\ \end{aligned} \]

设 \(T=dt\)(十分常用的技巧),那么有

\[= \sum^{n}_{T=1} \left\lfloor \frac{n}{T} \right\rfloor \left\lfloor \frac{m}{T} \right\rfloor \sum_{d \mid T}\mu(\frac{T}{d})f(d) \]

记 \(h=f*\mu\),那么有

\[= \sum^{n}_{T=1} \left\lfloor \frac{n}{T} \right\rfloor \left\lfloor \frac{m}{T} \right\rfloor h(T) \]


那么,现在的问题是如何求 \(h\)?考虑求 \(h(n)\)。

我们可以把 \(n\) 进行质因数分解:

\[n=\prod^{m}_{i=1}p_i^{c_i} \]

考虑 \(h(T)\) 的原本写法:

\[h(T)=\sum_{d \mid T}\mu(\frac{T}{d})f(d) \]

记 \(T=\prod^{m}_{i=1}p_i^{a_i}\),\(d=\prod^{m}_{i=1}p_i^{b_i}\)。

考虑 \(\mu(n)\) 的定义,当 \(n\) 中含有平方质因子时 \(\mu(n)=0\),即不会在 \(h\) 中产生贡献,可以不考虑。

所以 \(\dfrac{T}{d}\) 的质因数要满足最大幂指数小于 \(2\),即 \(a_i-b_i \in \left\{ 0,1 \right\}\)。

所以将 \(h(T)\) 改写为如下形式时

\[\displaystyle h(T) = \sum_{ab = T} f(a) \mu(b) \]

\[b=\prod^{m}_{i=1}p_i^{d_i}(d_i \in \left\{ 0,1 \right\}) \]

记 \(l=\max^m\limits_{i=1}c_i,k=\sum^{m}\limits_{i=1} \left[c_i=l \right]\)。即 \(l\) 为 \(n\) 所包含质因子的最大幂指数,\(k\) 为 \(n\) 所包含质因子幂指数中最大幂指数的个数。

我们发现 \(f(a)\) 的取值只有 \(l\) 和 \(l-1\) 两种可能(\(b\) 可能把最大幂指数的都取走,导致 \(f(a)\) 的取值少了 \(1\))。

我们先按 \(k=m\) 和 \(k \neq m\) 两种情况分类讨论,在每一项讨论中,我们再分 \(f(a)=l\) 和 \(f(a)=l-1\) 两种子情况。


当 \(k=m\) 时,贡献为(加号前为 \(l\) 的情况,加号后为 \(l-1\) 的情况)

\[\sum^{m-1}_{s=0}(l) \times (-1)^s \times {m \choose s} + (l-1) \times (-1)^m \times {m \choose m} \]

\(f(a)=l\) 的情况不会把最大幂指数的质因数都取走。

所以我们枚举到 \(m-1\),中间的 \((-1)^s\) 和 \((-1)^m\) 实质上就是莫比乌斯函数,最右边的二项式系数是枚举选取的方案。

将上面的式子加号右边的部分拆开,把带 \(l\) 的部分合并到左面,得到

\[\sum^{m}_{s=0}(l) \times (-1)^s \times {m \choose s} + 1 \times (-1)^m \]

二项式定理,得

\[-1 \times (-1)^m=(-1)^{m+1} \]


当 \(k \neq m\) 时,

当 \(f(a)=l\) 时,设在 \(k\) 个 \(c_i=l\) 的质数中选了 \(t\) 个,另外 \(m-k\) 个质数中选了 \(s\) 个,贡献为:

\[\sum^{m-k}_{s=0}\sum^{k-1}_{t=0} {k \choose t} \times l \times (-1)^{s+t} \times {m-k \choose s} \]

中间的 \((-1)^{s+t}\) 仍是莫比乌斯函数。因为 \(f(a)=l\),所以 \(k\) 个质数不能被选完,因此枚举到 \(k-1\)。

左右拆开,分别二项式定理,得

\[\begin{aligned} \sum^{k-1}_{t=0} {k \choose t} \times l \times (-1)^t \times \sum^{m-k}_{s=0}(-1)^s \times 1 ^{m-k-s} \times {m - k \choose s} =0 \end{aligned} \]

当 \(f(a)=l-1\) 时,\(k\) 个 \(c_i=l\) 的质数一定全部被选择,设在另外 \(m-k\) 个质数中选择 \(s\) 个,贡献为:

\[\begin{aligned} & \ \ \ \ \ \sum^{m-k}_{s=0}(l-1) \times (-1)^k \times (-1)^s \times {m-k \choose s} \\ &= \sum^{m-k}_{s=0}(l-1) \times (-1)^k \times (-1)^s \times 1^{m-k-s} \times {m-k \choose s} \\ &= (l-1) \times (-1)^k \times \sum^{m-k}_{s=0} (-1)^s \times 1^{m-k-s} \times {m-k \choose s} \\ &= 0 \end{aligned} \]


所以最终 \(h(n)\) 的表达式为

\[h(n)= \begin{cases} (-1)^{m + 1} & k = m \\ 0 & k \neq m \end{cases} \]

Code

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 1e7;
const int M = 10500;

int T,n,m;

bool p[N + M];
int pri[N >> 2],cnt,low[N + M];
int h[N + M],a[N + M];

void Seive() {
    p[1] = 1;

    for(int i = 2;i <= N; i++) {
        if(!p[i]) {
            cnt ++;
            low[i] = pri[cnt] = i;
            a[i] = h[i] = 1;
        }

        for(int j = 1;j <= cnt && i * pri[j] <= N; j++) {
            p[i * pri[j]] = 1;

            if(i % pri[j] == 0) {
                a[i * pri[j]] = a[i] + 1;
                low[i * pri[j]] = low[i] * pri[j];

                if(i == low[i]) 
                    h[i * pri[j]] = 1;
                else if(a[i / low[i]] == a[i * pri[j]])
                    h[i * pri[j]] = -h[i / low[i]];
                else
                    h[i * pri[j]] = 0;

                break;
            }

            a[i * pri[j]] = 1;
            low[i * pri[j]] = pri[j];
            if(a[i] == 1)
                h[i * pri[j]] = -h[i];
            else
                h[i * pri[j]] = 0;
        }
    }

    for(int i = 1;i <= N; i++)
        h[i] += h[i - 1];
    
    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    Seive();
    
    cin >> T;

    while(T --> 0) {
        cin >> n >> m;

        if(n > m)
            swap(n,m);

        int l = 1,r = 0,ans = 0;

        while(l <= n) {
            r = min(n / (n / l),m / (m / l));
            ans += (n / l) * (m / l) * (h[r] - h[l - 1]);
            l = r + 1;
        }

        cout << ans << "\n";
    }
    return 0;
}

标签:lfloor,right,frac,sum,times,DZY,BZOJ3309,Math,left
From: https://www.cnblogs.com/baijian0212/p/bzoj3309.html

相关文章

  • Math
    MathMath是一个内置对象,它拥有一些数学常数属性和数学函数方法。#实例属性#EMath.E属性表示自然对数的底数(或称为基数),e,约等于2.718。functiongetNapier():number{returnMath.E;}console.log(getNapier());//expectedoutput:2.718281828459045复制代码兼容......
  • Mathematica
    Mathematica是一款科学计算软件,很好地结合了数值和符号计算引擎、图形系统、编程语言、文本系统、和与其他应用程序的高级连接。很多功能在相应领域内处于世界领先地位,它也是使用最广泛的数学软件之一。Mathematica的发布标志着现代科技计算的开始。Mathematica是世界上通用计算系......
  • math---常见的摆线以及方程
    一、摆线、内摆线、平摆线的定义1、摆线圆沿直线滚动,圆上某固定点的运动轨迹叫做摆线2、内摆线3、外摆线圆A外切另一个圆B,并且圆A在圆B上无滑动滚动时,圆A上的某一固定点的轨迹叫做外摆线二、常考的摆线系列https://www.cnblogs.com/RioTian/p/16826090.html需要做的就......
  • 1300亿参数,国内首个数学大模型MathGPT上线!多项基准赶超GPT-4
    前言 数学的命运齿轮从此开始转动。国内首个专为数学打造的千亿级大模型MathGPT正式上线,在多项基准测试中碾压GPT-4,刷新SOTA。本文转载自新智元仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。......
  • math---多元函数积分方法整理
    复习到了这里,解题方法有点多,脑子有点乱,遂整理一下一、常规的三重积分解法1、先一后二法:用x,y表示z2、先二后一法:用z表示x,y3、球形积分4、常用技巧对称性、轮换对称、换元法(补行列式),其中球形积分就是用到了换元的思想:二、第一型曲线积分第一型曲线积分主要解决......
  • P9560 [SDCPC2023] E-Math Problem
    思路首先发现应该优先除,理由很简单,如果先乘以\(k\)再加上一个不超过\(k\)的值,那么除以\(k\)后,就除回去了,没有发生任何变化。所以我们可以先枚举除以多少次\(k\),得到除以这么多次\(k\)后的\(n\)。我们再进行若干次乘法,计算\(n\)的取值范围\([l,r]\),那么只要这个区间......
  • 自增自减运算符,和Math类,位运算
    自增自减运算符,和Math类,位运算1.自增intb=a++;a++//执行完这段代码后,先给b赋值,再自增intb=++a;++a//执行完这段代码前,先自增,再给b赋值2.自减(和自增类似)3.幂运算Math方法。Math.power(3,2)=3*3;4.位运算A=00111100;B=0001101;A&B=00001100;A|B=00111101;A^B=0......
  • 自增自减运算符,和Math类
    自增自减运算符,和Math类1.自增intb=a++;a++//执行完这段代码后,先给b赋值,再自增intb=++a;++a//执行完这段代码前,先自增,再给b赋值2.自减(和自增类似)3.幂运算Math方法。Math.power(3,2)=3*3;......
  • math---常见的二次曲面
    ......
  • Math Problem
                                                  E-MathProblem##题面翻译**【题目描述】**给定两个正整数$n$和$k$,您可以进行以下两种操作任意次(包括零次):-选择一个整数......