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

丢题解跑:http://blog.csdn.net/PoPoQQQ/article/details/46820689

%运算转化成gcd


#include
#include
#include
using namespace std;
typedef long long ll;

const int P=998244353;
const int N=500000;

int n,m; double x; ll ans;

inline ll Sum(ll x){
	return (x+1)*x/2%P;
}

int prime[N+5],tot,mobius[N+5],vst[N+5];

inline void Init(){
	mobius[1]=1;
	for (int i=2;i<=n;i++)
	{
		if (!vst[i])
			prime[++tot]=i,mobius[i]=-1;
		for (int j=1;j<=tot && (ll)i*prime[j]<=n;j++){
			vst[i*prime[j]]=1;
			if (i%prime[j]==0)
			{
				mobius[i*prime[j]]=0;
				break;
			}
			mobius[i*prime[j]]=mobius[i]*mobius[prime[j]];
		}
	}
}

int main()
{
	freopen("t.in","r",stdin);
	freopen("t.out","w",stdout);
	scanf("%d%d%lf",&n,&m,&x);
	if (n>m) swap(n,m);
	Init();
	ans=((Sum(n)*Sum(m)-Sum(n)*m-Sum(m)*n)%P+P)%P;
	for (int d=1;d<=n;d++){
		ll tem=d+(int)x/d*d*2;
        for(int k=1;(ll)k*d<=n;k++)
            (ans+=tem*(mobius[k]+P)%P*(n/d/k)%P*(m/d/k)%P)%=P;
	}
	ans=(ans*(P+1>>1)%P);
	printf("%lld\n",ans);
	return 0;
}


你可能感兴趣的:(莫比乌斯反演&杜教筛)