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

题目

思路

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

\(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;
}
posted @ 2020-01-26 19:13  loney_s  阅读(149)  评论(0)    收藏  举报