首页 > 其他 > 详细

习题:[BZOJ4173]数学 (欧拉函数)

时间:2020-01-26 19:30:15      阅读:67      评论:0      收藏:0      [点我收藏+]

题目

技术分享图片

思路

我们先对条件进行一下变形

\(m \% k+n\%k\ge k\rightarrow m-k*\lfloor\frac{m}{k}\rfloor+n-k*\lfloor\frac{n}{k}\rfloor\ge k\)

两边同时整除一个k

\(\frac{m+n}{k}-\lfloor\frac{m}{k}\rfloor-\lfloor\frac{n}{k}\rfloor\ge1\)

因为\(\lfloor\frac{m}{k}\rfloor和\lfloor\frac{n}{k}\rfloor\)都为整数,且不等式的右边也为整数

所以可以写成

\(\lfloor\frac{m+n}{k}\rfloor-\lfloor\frac{m}{k}\rfloor-\lfloor\frac{n}{k}\rfloor\ge1\)

然而我们知道,只针对于\(\lfloor\frac{m+n}{k}\rfloor-\lfloor\frac{m}{k}\rfloor-\lfloor\frac{n}{k}\rfloor\)这个式子

他的范围是很好求的

\(0\le\lfloor\frac{m+n}{k}\rfloor-\lfloor\frac{m}{k}\rfloor-\lfloor\frac{n}{k}\rfloor\le1\)

\(\lfloor\frac{m+n}{k}\rfloor-\lfloor\frac{m}{k}\rfloor-\lfloor\frac{n}{k}\rfloor\)本身即为整数

所以

\(\lfloor\frac{m+n}{k}\rfloor-\lfloor\frac{m}{k}\rfloor-\lfloor\frac{n}{k}\rfloor=1\)

\(1\le k \le n+m\)

所以

\(\begin{aligned}\sum_{i\in S(m,m)}\varphi(i)&=\sum_{i=1}^{n+m}((\lfloor\frac{m+n}{i}\rfloor-\lfloor\frac{m}{i}\rfloor-\lfloor\frac{n}{i}\rfloor)*\varphi(i))\\&=\sum_{i=1}^{n+m}(\lfloor\frac{m+n}{i}\rfloor*\varphi(i))-\sum_{i=1}^{n+m}(\lfloor\frac{m}{i}\rfloor*\varphi(i))-\sum_{i=1}^{n+m}(\lfloor\frac{n}{i}\rfloor*\varphi(i))\end{aligned}\)

之后我们注意到当\(i\ge n\)\(\lfloor\frac{n}{i}\rfloor=0\)

所以最终的等式即为

\(\sum_{i=1}^{n+m}(\lfloor\frac{m+n}{i}\rfloor*\varphi(i))-\sum_{i=1}^{m}(\lfloor\frac{m}{i}\rfloor*\varphi(i))-\sum_{i=1}^{n}(\lfloor\frac{n}{i}\rfloor*\varphi(i))\)

同时

\(\begin{aligned}\sum_{d=1}^{n}(\varphi(d)*\lfloor\frac{n}{d}\rfloor)&=\sum_{i=1}^{n}\sum_{d|i}^{i}\varphi(d)\\&=\sum_{i=1}^{n}i\\&=\frac{n*(1+n)}{2}\\&=\frac{n}{2}+\frac{n^2}{2}\end{aligned}\)

所以

原式= \(\frac{n+m}{2}+\frac{n^2+2*n*m+m^2}{2}-\frac{n}{2}-\frac{n^2}{2}-\frac{m}{2}-\frac{m^2}{2}=n*m\)

所以答案即为\(\varphi(n)*\varphi(m)*n*m\)

代码

#include<iostream>
using namespace std;
const int mod=998244353;
long long phi(long long x)
{
    long long ans=x;
    for(long long i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            ans-=ans/i;
            while(!(x%i))
            {
                x/=i;
            }
        }
    }
    if(x>1)
    {
        ans-=ans/x;
    }
    return ans%mod;
}
long long n,m;
long long ans;
int main()
{
    cin>>n>>m;
    ans=phi(n)*phi(m)%mod;
    n%=mod;
    m%=mod;
    ans=ans*n%mod*m%mod;
    cout<<ans;
    return 0;
}

习题:[BZOJ4173]数学 (欧拉函数)

原文:https://www.cnblogs.com/loney-s/p/12234642.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!