【莫比乌斯反演】【杜教筛】简单的数学题

题目

∑ i = 1 n ∑ j = 1 n i j g c d ( i , j ) \sum_{i=1}^n\sum_{j=1}^nijgcd(i,j) i=1nj=1nijgcd(i,j)

题解

∑ i = 1 n ∑ j = 1 n i j g c d ( i , j ) ∑ d = 1 n d 3 ∑ i = 1 ⌊ n d ⌋ i ∑ j = 1 ⌊ n d ⌋ j [ g c d ( i , j ) = = 1 ] ∑ d = 1 n d 3 ∑ i = 1 ⌊ n d ⌋ i ∑ j = 1 ⌊ n d ⌋ j ∑ e ∣ g c d ( i , j ) μ ( e ) \sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\\\sum_{d=1}^nd^3\sum_{i=1}^{\lfloor \frac n d\rfloor}i\sum_{j=1}^{\lfloor \frac n d\rfloor}j[gcd(i,j)==1]\\\sum_{d=1}^nd^3\sum_{i=1}^{\lfloor \frac n d\rfloor}i\sum_{j=1}^{\lfloor \frac n d\rfloor}j\sum_{e|gcd(i,j)}\mu(e) i=1nj=1nijgcd(i,j)d=1nd3i=1dnij=1dnj[gcd(i,j)==1]d=1nd3i=1dnij=1dnjegcd(i,j)μ(e)
f ( x ) = ∑ i = 1 x i f(x)=\sum_{i=1}^xi f(x)=i=1xi
∑ d = 1 n d 3 ∑ e = 1 ⌊ n d ⌋ μ ( e ) e 2 ∑ i = 1 ⌊ n d e ⌋ i ∑ j = 1 ⌊ n d e ⌋ j ∑ T = 1 n T 2 ∑ d ∣ T d μ ( T d ) f 2 ( ⌊ n d e ⌋ ) ∑ T = 1 n T 2 ϕ ( T ) f 2 ( ⌊ n T ⌋ ) \sum_{d=1}^nd^3\sum_{e=1}^{\lfloor \frac n d\rfloor}\mu(e) e^2\sum_{i=1}^{\lfloor \frac n {de}\rfloor}i\sum_{j=1}^{\lfloor \frac n {de}\rfloor}j\\ \sum_{T=1}^nT^2\sum_{d|T}d\mu(\frac T d)f^2(\lfloor\frac{n}{de}\rfloor)\\ \sum_{T=1}^nT^2\phi(T)f^2(\lfloor\frac{n}{T}\rfloor) d=1nd3e=1dnμ(e)e2i=1denij=1denjT=1nT2dTdμ(dT)f2(den)T=1nT2ϕ(T)f2(Tn)
f ( x ) = x 2 ϕ ( x ) g ( x ) = x 2 h ( x ) = ( f ∗ g ) ( x ) = x 3 f(x)=x^2\phi(x)\\ g(x)=x^2\\ h(x)=(f*g)(x)=x^3 f(x)=x2ϕ(x)g(x)=x2h(x)=(fg)(x)=x3
整除分块套杜教筛。。。

#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define ll long long
using namespace std;
using namespace tr1;
const int N=5e6+10,M=5e6;
ll mod,inv2,inv6;
ll quick_mul(ll a,ll k)
{
	ll ans=1;
	while(k)
	{
		if(k&1)ans=ans*a%mod;
		a=a*a%mod;
		k>>=1;
	}return ans;
}
ll inv(ll a){return quick_mul(a,mod-2);}
ll phi[N];
int z[N],p;
bool vis[N];
void Sieve()
{
	phi[1]=1;
	for(int i=2;i<=M;i++)
	{
		if(!vis[i])z[++p]=i,phi[i]=(i-1)%mod;
		for(int j=1;j<=p&&i*z[j]<=M;j++)
		{
			vis[i*z[j]]=1;
			if(i%z[j]==0){phi[i*z[j]]=phi[i]*z[j]%mod;break;}
			phi[i*z[j]]=phi[i]*phi[z[j]]%mod;
		}
	}
	for(int i=1;i<=M;i++)phi[i]=(phi[i]*i%mod*i%mod+phi[i-1])%mod;
}
ll f(ll n){n%=mod;return n*(n+1)%mod*inv2%mod;}
ll f2(ll n){n%=mod;return n*(n+1)%mod*(2ll*n%mod+1)%mod*inv6%mod;}
unordered_map<ll,ll>Phi;
ll Sum(ll n)
{
	if(n<=M)return phi[n];
	if(Phi[n])return Phi[n];
	ll ans=f(n)*f(n)%mod;
	for(ll l=2,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		ans=((ans-(f2(r)-f2(l-1)+mod)%mod*Sum(n/l)%mod)%mod+mod)%mod;
	}return Phi[n]=ans;
}
ll work(ll n)
{
	ll ans=0;
	for(ll l=1,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		ans=(ans+f(n/l)*f(n/l)%mod*(Sum(r)-Sum(l-1)+mod)%mod)%mod;
	}return ans;
}
int main()
{
	ll n;
	scanf("%lld%lld",&mod,&n);
	Sieve();inv2=inv(2ll);inv6=inv(6ll);
	printf("%lld",work(n));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值