洛谷 P3768 简单的数学题 题解

题目传送门

题目大意: ( ∑ i = 1 n ∑ j = 1 n i j gcd ⁡ ( i , j ) )   m o d   p (\sum_{i=1}^n \sum_{j=1}^n ij\gcd(i,j)) \bmod p (i=1nj=1nijgcd(i,j))modp

题解

一看到 gcd ⁡ \gcd gcd 果断莫比乌斯反演,大力推柿子:
∑ i = 1 n ∑ j = 1 n i j gcd ⁡ ( i , j ) = ∑ i = 1 n ∑ j = 1 n i j ∑ k = 1 n k [ gcd ⁡ ( i , j ) = k ] = ∑ k = 1 n k × k 2 ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ n k ⌋ i j [ gcd ⁡ ( i , j ) = 1 ] = ∑ k = 1 n k 3 ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ n k ⌋ i j ∑ d ∣ gcd ⁡ ( i , j ) μ ( d ) = ∑ k = 1 n k 3 ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ n k ⌋ i j ∑ d = 1 ⌊ n k ⌋ μ ( d ) [ d ∣ gcd ⁡ ( i , j ) ] = ∑ k = 1 n k 3 ∑ d = 1 ⌊ n k ⌋ μ ( d ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ n k ⌋ i j [ d ∣ gcd ⁡ ( i , j ) ] = ∑ k = 1 n k 3 ∑ d = 1 ⌊ n k ⌋ μ ( d ) × d 2 ∑ i = 1 ⌊ n k d ⌋ ∑ j = 1 ⌊ n k d ⌋ i j = ∑ k = 1 n k 3 ∑ d = 1 ⌊ n k ⌋ μ ( d ) × d 2 ∑ i = 1 ⌊ n k d ⌋ i × ∑ j = 1 ⌊ n k d ⌋ j \sum_{i=1}^n \sum_{j=1}^n ij\gcd(i,j)\\ =\sum_{i=1}^n \sum_{j=1}^n ij \sum_{k=1}^n k[\gcd(i,j)=k]\\ =\sum_{k=1}^n k \times k^2 \sum_{i=1}^{\lfloor \frac n k \rfloor} \sum_{j=1}^{\lfloor \frac n k \rfloor} ij [\gcd(i,j)=1]\\ =\sum_{k=1}^n k^3 \sum_{i=1}^{\lfloor \frac n k \rfloor} \sum_{j=1}^{\lfloor \frac n k \rfloor} ij \sum_{d|\gcd(i,j)} \mu(d)\\ =\sum_{k=1}^n k^3 \sum_{i=1}^{\lfloor \frac n k \rfloor} \sum_{j=1}^{\lfloor \frac n k \rfloor} ij \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) [d|\gcd(i,j)]\\ =\sum_{k=1}^n k^3 \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) \sum_{i=1}^{\lfloor \frac n k \rfloor} \sum_{j=1}^{\lfloor \frac n k \rfloor} ij [d|\gcd(i,j)]\\ =\sum_{k=1}^n k^3 \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) \times d^2 \sum_{i=1}^{\lfloor \frac n {kd} \rfloor} \sum_{j=1}^{\lfloor \frac n {kd} \rfloor} ij \\ =\sum_{k=1}^n k^3 \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) \times d^2 \sum_{i=1}^{\lfloor \frac n {kd} \rfloor} i \times \sum_{j=1}^{\lfloor \frac n {kd} \rfloor} j \\ i=1nj=1nijgcd(i,j)=i=1nj=1nijk=1nk[gcd(i,j)=k]=k=1nk×k2i=1knj=1knij[gcd(i,j)=1]=k=1nk3i=1knj=1knijdgcd(i,j)μ(d)=k=1nk3i=1knj=1knijd=1knμ(d)[dgcd(i,j)]=k=1nk3d=1knμ(d)i=1knj=1knij[dgcd(i,j)]=k=1nk3d=1knμ(d)×d2i=1kdnj=1kdnij=k=1nk3d=1knμ(d)×d2i=1kdni×j=1kdnj

∑ i = 1 n i \sum_{i=1}^n i i=1ni p ( n ) p(n) p(n),显然 p ( n ) = ( 1 + n ) × n 2 p(n)=\frac {(1+n)\times n} 2 p(n)=2(1+n)×n那么有:
= ∑ k = 1 n k 2 ∑ d = 1 ⌊ n k ⌋ μ ( d ) × d 2 × p ( ⌊ n k d ⌋ ) 2 =\sum_{k=1}^n k^2 \sum_{d=1}^{\lfloor \frac n k \rfloor} \mu(d) \times d^2 \times p(\lfloor \frac n {kd} \rfloor)^2 =k=1nk2d=1knμ(d)×d2×p(kdn)2

发现 p ( ⌊ n k d ⌋ ) 2 p(\lfloor \frac n {kd} \rfloor)^2 p(kdn)2 里面的这个 k d kd kd 比较丑,用 i i i 代替掉,更换枚举对象。
= ∑ i = 1 n p ( ⌊ n i ⌋ ) 2 ∑ k ∣ i k 3 × μ ( i k ) × ( i k ) 2 = ∑ i = 1 n p ( ⌊ n i ⌋ ) 2 × i 2 ∑ k ∣ i μ ( i k ) × k = ∑ i = 1 n p ( ⌊ n i ⌋ ) 2 × i 2 ∑ k ∣ i μ ( k ) × i k =\sum_{i=1}^n p(\lfloor \frac n i \rfloor)^2 \sum_{k|i} k^3\times \mu(\frac i k) \times (\frac i k)^2\\ =\sum_{i=1}^n p(\lfloor \frac n i \rfloor)^2 \times i^2 \sum_{k|i} \mu(\frac i k)\times k\\ =\sum_{i=1}^n p(\lfloor \frac n i \rfloor)^2 \times i^2 \sum_{k|i} \mu(k)\times \frac i k =i=1np(in)2kik3×μ(ki)×(ki)2=i=1np(in)2×i2kiμ(ki)×k=i=1np(in)2×i2kiμ(k)×ki

发现后面的这个 ∑ k ∣ i μ ( k ) × i k \sum\limits_{k|i} \mu(k)\times \frac i k kiμ(k)×ki 就是 μ ∗ i d = φ \mu * id =\varphi μid=φ 的形式,所以有
= ∑ i = 1 n p ( ⌊ n i ⌋ ) 2 × i 2 × φ ( i ) =\sum_{i=1}^n p(\lfloor \frac n i \rfloor)^2 \times i^2 \times \varphi(i) =i=1np(in)2×i2×φ(i)

后面的 i 2 × φ ( i ) i^2 \times \varphi(i) i2×φ(i) 是可以用杜教筛搞的,于是就做完了。

然后再推一下如何用杜教筛来搞这个东西。

f ( n ) = n 2 × φ ( n ) , f ∗ g = h f(n)=n^2\times \varphi(n),f*g=h f(n)=n2×φ(n),fg=h,那么有
( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) × g ( n d ) ( f ∗ g ) ( n ) = ∑ d ∣ n φ ( d ) × i 2 × g ( n d ) (f*g)(n)=\sum_{d|n} f(d)\times g(\frac n d)\\ (f*g)(n)=\sum_{d|n} \varphi(d) \times i^2 \times g(\frac n d) (fg)(n)=dnf(d)×g(dn)(fg)(n)=dnφ(d)×i2×g(dn)

发现这个 i 2 i^2 i2 很不和谐,于是考虑 g ( n ) = i d ( n ) 2 g(n)=id(n)^2 g(n)=id(n)2,那么有
( f ∗ g ) ( n ) = ∑ d ∣ n φ ( d ) × d 2 × i d ( n d ) 2 ( f ∗ g ) ( n ) = ∑ d ∣ n φ ( d ) × d 2 × ( n d ) 2 ( f ∗ g ) ( n ) = n 2 ∑ d ∣ n φ ( d ) ( f ∗ g ) ( n ) = n 3 (f*g)(n)=\sum_{d|n} \varphi(d) \times d^2 \times id(\frac n d)^2\\ (f*g)(n)=\sum_{d|n} \varphi(d) \times d^2 \times (\frac n d)^2\\ (f*g)(n)=n^2 \sum_{d|n} \varphi(d)\\ (f*g)(n)=n^3 (fg)(n)=dnφ(d)×d2×id(dn)2(fg)(n)=dnφ(d)×d2×(dn)2(fg)(n)=n2dnφ(d)(fg)(n)=n3

于是 f , g , h f,g,h f,g,h 都定下来了,而且 h h h 很好求,正是我们想要的,于是继续推柿子。
∑ i = 1 n h ( i ) = ∑ i = 1 n ∑ d ∣ i f ( d ) × g ( i d ) ∑ i = 1 n h ( i ) = ∑ i = 1 n g ( i ) ∑ j = 1 ⌊ n i ⌋ f ( j ) ∑ i = 1 n h ( i ) = ∑ i = 1 n g ( i ) S ( ⌊ n i ⌋ ) ∑ i = 1 n h ( i ) = S ( n ) + ∑ i = 2 n g ( i ) S ( ⌊ n i ⌋ ) S ( n ) = ∑ i = 1 n h ( i ) − ∑ i = 2 n g ( i ) S ( ⌊ n i ⌋ ) \sum_{i=1}^n h(i) =\sum_{i=1}^n \sum_{d|i} f(d) \times g(\frac i d)\\ \sum_{i=1}^n h(i) =\sum_{i=1}^n g(i) \sum_{j=1}^{\lfloor \frac n i \rfloor}f(j)\\ \sum_{i=1}^n h(i) =\sum_{i=1}^n g(i) S(\lfloor \frac n i \rfloor)\\ \sum_{i=1}^n h(i) =S(n)+\sum_{i=2}^n g(i) S(\lfloor \frac n i \rfloor)\\ S(n)=\sum_{i=1}^n h(i)-\sum_{i=2}^n g(i) S(\lfloor \frac n i \rfloor) i=1nh(i)=i=1ndif(d)×g(di)i=1nh(i)=i=1ng(i)j=1inf(j)i=1nh(i)=i=1ng(i)S(in)i=1nh(i)=S(n)+i=2ng(i)S(in)S(n)=i=1nh(i)i=2ng(i)S(in)

两个小性质:

1 3 + 2 3 + 3 3 + . . . + n 3 = ( n ( n + 1 ) 2 ) 2 1^3+2^3+3^3+...+n^3=(\frac {n(n+1)} 2)^2 13+23+33+...+n3=(2n(n+1))2

1 2 + 2 2 + 3 2 + . . . + n 2 = 1 6 n ( n + 1 ) ( 2 n + 1 ) 1^2+2^2+3^2+...+n^2=\frac 1 6 n(n+1)(2n+1) 12+22+32+...+n2=61n(n+1)(2n+1)(这个在代码里面用到,用来处理下面的 i 2 i^2 i2

于是有
S ( n ) = p ( n ) 2 − ∑ i = 2 n i 2 S ( ⌊ n i ⌋ ) S(n)=p(n)^2-\sum_{i=2}^n i^2 S(\lfloor \frac n i \rfloor) S(n)=p(n)2i=2ni2S(in)

注意,上面的除以 2 2 2 和除以 6 6 6 别忘了要用逆元。

以及……大数据的 n n n 是大于 p p p 的,以至于这题的取模相当讲究……

于是就做完了!代码如下:

#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define maxn 6000010
#define ll long long
#define p(x) (x%mod*((x+1ll)%mod)%mod*inv2%mod)
#define w(x) ((x)%mod*inv6%mod*((x)%mod+1ll)%mod*(2ll*((x)%mod)%mod+1ll)%mod)

ll n,mod,inv2,inv6;
int prime[maxn],t=0;
ll phi[maxn];
bool v[maxn];
ll ans=0;
ll ksm(ll x,int y)
{
	ll re=1,tot=x;
	while(y>0)
	{
		if(y%2==1)re=re*tot%mod;
		y/=2;
		tot=tot*tot%mod;
	}
	return re;
}
void work()
{
    phi[1]=1;//先预处理phi的前6000000位,优化杜教筛复杂度
    for(int i=2;i<=maxn-10;i++)
    {
        if(!v[i])prime[++t]=i,phi[i]=i-1;
        for(int j=1;j<=t&&i*prime[j]<=maxn-10;j++)
        {
            v[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
    for(int i=2;i<=maxn;i++)
    phi[i]=phi[i]*(ll)i%mod*(ll)i%mod,phi[i]=(phi[i]+phi[i-1])%mod;
    //让phi[i]乘上i^2,就得到了f(i),再求个前缀和,就变成了S(i)
    inv2=ksm(2ll,mod-2);//预处理2和6的逆元
    inv6=ksm(6ll,mod-2);
}
map<ll,ll>mp;
ll solve(ll x)
{
	if(x<=maxn-10)return phi[x];
	if(mp[x])return mp[x];
	ll ans=p(x)*p(x)%mod;
	ll l=2,r;
	while(l<=x)
	{
		r=x/(x/l);
		ans=(ans-solve(x/l)*(w(r)-w(l-1)+mod)%mod+mod)%mod;
		//柿子都跟上面的一样,没啥好说的
		l=r+1;
	}
	mp[x]=ans;
	return ans;
}

int main()
{
    scanf("%lld %lld",&mod,&n);
    work();
    ll l=1,r;
    while(l<=n)
    {
    	r=n/(n/l);
    	ans=(ans+p(n/l)*p(n/l)%mod*(solve(r)-solve(l-1)+mod)%mod)%mod;
    	l=r+1ll;
    }
    printf("%lld\n",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值