# BZOJ 4174 tty的求助 莫比乌斯反演

m1k=0nk+xm$\sum_{k=0}^{m-1}\lfloor\frac{nk+x}m\rfloor$
=m1k=0(nk%m+xm+nknk%mm)$=\sum_{k=0}^{m-1}(\lfloor\frac{nk\%m+x}m\rfloor+\frac{nk-nk\%m}m)$
=m1k=0(nk%m+xm+nkmnk%mm)$=\sum_{k=0}^{m-1}(\lfloor\frac{nk\%m+x}m\rfloor+\frac{nk}m-\frac{nk\%m}m)$

d=gcd(n,m)$d=\gcd(n,m)$，那么有

m1k=0nk%m+xm$\sum_{k=0}^{m-1}\lfloor\frac{nk\%m+x}m\rfloor$
=dmd1k=0kd+xm$=d*\sum_{k=0}^{\frac md-1}\lfloor\frac{kd+x}m\rfloor$
=d(mdxx%mm+md1k=0kd+x%mm)$=d*(\frac md*\frac{x-x\%m}m+\sum_{k=0}^{\frac md-1}\lfloor\frac{kd+x\%m}m\rfloor)$
=d(mdxx%mm+md1k=0[kd+x%mm])$=d*(\frac md*\frac{x-x\%m}m+\sum_{k=0}^{\frac md-1}[kd+x\%m\geq m])$
=d(xx%md+x%md)$=d*(\frac{x-x\%m}d+\lfloor\frac{x\%m}d\rfloor)$
=dxd$=d*\lfloor\frac xd\rfloor$

m1k=0nkm=nmm(m1)2=nmn2$\sum_{k=0}^{m-1}\frac{nk}m=\frac nm*\frac{m*(m-1)}2=\frac{n*m-n}2$

m1k=0nk%mm=dmd1k=0kdm=d2m(md1)md2=md2$\sum_{k=0}^{m-1}\frac{nk\%m}m=d*\sum_{k=0}^{\frac md-1}\frac{kd}m=\frac{d^2}m*\frac{(\frac md-1)*\frac md}2=\frac{m-d}2$

Nn=1Mm=1(dxd+nmn2md2)$\sum_{n=1}^N\sum_{m=1}^M(d*\lfloor\frac xd\rfloor+\frac{n*m-n}2-\frac{m-d}2)$
=12Nn=1Mm=1(2dxd+d+nmnm)$=\frac12*\sum_{n=1}^N\sum_{m=1}^M(2*d*\lfloor\frac xd\rfloor+d+n*m-n-m)$
=12(S(N)S(M)S(N)mS(M)n+min(N,M)d=1(d+2dxd)min(Nd,Md)k=1μ(k)NdkMdk)$=\frac12*(S(N)*S(M)-S(N)*m-S(M)*n+\sum_{d=1}^{min(N,M)}(d+2*d*\lfloor\frac xd\rfloor)\sum_{k=1}^{min(\lfloor\frac Nd\rfloor,\lfloor\frac Md\rfloor)}\mu(k)*\lfloor\frac N{d*k}\rfloor*\lfloor\frac M{d*k}\rfloor)$

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 500500
#define MOD 998244353
using namespace std;
int n,m,x;
long long ans;
int mu[M];
int prime[M],tot;
bool not_prime[M];
void Linear_Shaker()
{
int i,j;
mu[1]=1;
for(i=2;i<=500000;i++)
{
if(!not_prime[i])
{
prime[++tot]=i;
mu[i]=MOD-1;
}
for(j=1;prime[j]*i<=500000;j++)
{
not_prime[prime[j]*i]=true;
if(i%prime[j]==0)
{
mu[prime[j]*i]=0;
break;
}
mu[prime[j]*i]=(MOD-mu[i])%MOD;
}
}
}
long long Sum(long long n)
{
return (n*(n+1)>>1)%MOD;
}
int main()
{
int i,j;
cin>>n>>m>>x;
Linear_Shaker();
ans=((Sum(n)*Sum(m)-Sum(n)*m-Sum(m)*n)%MOD+MOD)%MOD;
if(n>m) swap(n,m);
for(i=1;i<=n;i++)
{
long long temp=i+x/i*i*2;
for(j=1;j*i<=n;j++)
(ans+=temp*mu[j]%MOD*(n/i/j)%MOD*(m/i/j)%MOD)%=MOD;
}
cout<<(ans*(MOD+1>>1)%MOD)<<endl;
return 0;
}
• 本文已收录于以下专栏：

举报原因： 您举报文章：BZOJ 4174 tty的求助 莫比乌斯反演 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)