C、求和公式 题解

题意是求这个:

(\sum _{i=1}^{n}\sum _{j=1}^{m}i^2j(n\%i)(m\%j))\%(10^9+7)

那么化简一下:

\sum _{i=1}^{n}i^2(n\%i)\sum _{j=1}^{m}j(m\%j)

左边

\sum _{i=1}^{n}i^2(n\%i)=\sum _{i=1}^{n}i^2(n-i*\left \lfloor \frac{n}{i} \right \rfloor)=\sum _{i=1}^{n}(i^2n-i^3\left \lfloor \frac{n}{i} \right \rfloor)

 

=\frac{n*n*(n+1)*(2*n+1)}{6}-\sum _{i=1}^{n}i^3\left \lfloor \frac{n}{i} \right \rfloor

 

就可以用整除分块做法了

同理右边:

 

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll powmod(ll a,ll b)
{
    ll res=1;
    for(;b;b>>=1)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
    }
    return res;
}
ll inv(ll x)
{
    return powmod(x,mod-2);
}
ll getn2(ll n)
{
    return n*(n+1)%mod*(2*n+1)%mod*inv(6)%mod;
}
ll getn3(ll n)
{
	return ((n+1)*n%mod*(2+(n-1)*(n+2)%mod)%mod)%mod*powmod(4,mod-2)%mod;
}
ll caly(ll n)
{
    ll ans=0;
    for(int l=1,r;l<=n;l=r+1)
    {
        r=n/(n/l);
        ll tmp=(getn2(r)-getn2(l-1)+mod)%mod;
        ans=(ans+tmp*(n/l)%mod)%mod;
    }
    return (n*n%mod*(n+1)%mod*inv(2)%mod-ans+mod)%mod;
}

ll calx(ll n)
{
	ll ans=0;
	for(int l=1,r;l<=n;l=r+1)
    {
        r=n/(n/l);
        ll tmp=(getn3(r)-getn3(l-1)+mod)%mod;

        ans=(ans+tmp*(n/l)%mod)%mod;
    }

    return (n*getn2(n)%mod-ans+mod)%mod;
}
int main()
{
    ll n,m;
    cin>>n>>m;
    ll ans1=calx(n);
    ll ans2=caly(m);
    printf("%lld\n",ans1*ans2%mod);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙大学ccsu_deer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值