zoukankan      html  css  js  c++  java
  • 【BZOJ4173】数学 题解(数论)

    前言:体验到了推式子的快感orz

    题目大意:求$varphi(n)*varphi(m)*sum_{n mod k+m mod kgeq k} varphi(k) mod 998244353$

    ---------------------------

    设$n=q_1k+r_1,m=q_2k+r_2$,那么$q_1=lfloor frac{n}{k} floor,q_2=lfloor frac{m}{k} floor$。

    $n+m=(q_1+q_2)k+r_1+r_2$

    $(n+m)-(q_1+q_2)k=r_1+r_2$

    $lfloor frac{n+m}{k} floor-lfloor frac{n}{k} floor-lfloor frac{m}{k} floor=r_1+r_2=1$

    所以现在变为:找到满足上式的$k$。

    我们先给出一个式子:

    $ans=sumlimits_{i=1}^{n+m}varphi(k)*lfloor frac{n+m}{k} floor-sumlimits_{i=1}^n varphi(k)*lfloor frac{n}{k} floor-sumlimits_{i=1}^m varphi(k)*lfloor frac{m}{k} floor$

    这个式子是什么意思?

    对于$(lfloor frac{n+m}{k} floor-lfloor frac{n}{k} floor-lfloor frac{m}{k} floor)*varphi(k)$:

    如果$k$满足条件,那么系数为$1$,对答案有贡献。如果$k$不合法那么系数为$0$,对答案是没有贡献的。所以上面给出的式子可以计算所有合法的答案。

    现在我们尝试对$sumlimits_{i=1}^n varphi(k)*lfloor frac{n}{k} floor$进行化简。

    有这样一个关系:$sumlimits_{i=1}^n i=sumlimits_{i=1}^n sumlimits_{k|i}varphi(k)=sumlimits_{i=1}^n varphi(k)*lfloor frac{n}{k} floor$

    证明:$sumlimits_{i=1}^n i=sumlimits_{i=1}^n sumlimits_{k|i}varphi(k)$

    对于一个数$i$,在小于等于它的数中有这样的关系:

    1.最大公约数为$1$,记为$G_1$,个数显然是$varphi(i)$

    2.最大公约数为$2$,记为$G_2$,个数是$varphi(i/2)$

    $cdots$

    i.最大公约数为$i$,记为$G_i$,个数为$1$。

    这些集合的并集大小为$i$,所以上述等式成立。

    现在来看$sumlimits_{i=1}^n sumlimits_{k|i}varphi(k)=sumlimits_{i=1}^n varphi(k)*lfloor frac{n}{k} floor$

    对于左式,其意义为考虑每个$i$对答案的贡献;而对于右式,其意义为考虑每个合法的$k$对答案的贡献。二者对于答案的总贡献是相同的,所以等式成立。

    经过化简,最终答案为$varphi(n)*varphi(m)*n*m$

    代码:

    #include<bits/stdc++.h>
    #define int  long long
    using namespace std;
    const int mod=998244353;
    int n,m,ans;
    inline int phi(int x)
    {
        int res=x,m=x;
        for (int i=2;i*i<=m;i++)
        {
            if (x%i) continue;
            res=res/i*(i-1);
            while(!(x%i)) x/=i;
        }
        if (x>1) res=res/x*(x-1);
        return res%mod;
    }
    signed main()
    {
        cin>>n>>m;
        ans=((n%mod)*(m%mod))%mod;
        ans*=phi(n),ans%=mod;
        ans*=phi(m),ans%=mod;
        printf("%lld",(ans+mod)%mod);
        return 0;
    }
  • 相关阅读:
    Redis Pipeline原理分析
    python 装饰器,传递类以及参数
    q
    Redis的EXPIRE过期机制介绍
    z
    julia .文档
    julia 安装
    python 弧度与角度互转
    python 角度和弧度转化
    机器人行业中我们常说的roll、yaw、pitch是什么?
  • 原文地址:https://www.cnblogs.com/Invictus-Ocean/p/13378377.html
Copyright © 2011-2022 走看看