首先咱们能够发现,对于每个i,后一项的\(\sum_{j=1}^{m}(m \bmod j)\)都相同,合并提出,得:
\(\sum_{i=1}^{n} n \bmod i \sum_{j=1}^{m} m \bmod j (i!=j)\)
而后咱们能够将其拆成两部分:\(\sum_{i=1}^{n} n \bmod i\)和\(\sum_{j=1}^{m} m \bmod j\),
答案即为这两部分乘积,减去(i=j)的部分:
\((\sum_{i=1}^{n} n \bmod i)*(\sum_{j=1}^{m} m \bmod j)-\sum_{i=1}^{min(n,m)} (n \bmod i)*(m \bmod i)\)
将\(n \bmod i\)拆为\(n-i[\frac{n}{i}]\),得:
\((\sum_{i=1}^{n}(n-i[\frac{n}{i}]))(\sum_{j=1}^{m}(m-j[\frac{m}{j}]))-\sum_{i=1}^{min(n,m)}(n-i[\frac{n}{i}])(m-i[\frac{m}{i}])\)
其中:
\(\sum_{i=1}^{n}(n-i[\frac{n}{i}])=n^2-\sum_{i=1}^{n} i[\frac{n}{i}]\)
\(\sum_{i=1}^{min(n,m)}(n-i[\frac{n}{i}])(m-i[\frac{m}{i}])=\sum_{i=1}^{min(n,m)}(nm-i(m[\frac{n}{i}]+n[\frac{m}{i}])+[\frac{n}{i}][\frac{m}{i}]i^2)\)
就变成:
\((n^2-\sum_{i=1}^{n} i[\frac{n}{i}])(m^2-\sum_{j=1}^{m} j[\frac{m}{j}])-\sum_{i=1}^{min(n,m)}(nm-i(m[\frac{n}{i}]+n[\frac{m}{i}])+[\frac{n}{i}][\frac{m}{i}]i^2)\)
这三部分分别用数论分块作,注意:
\(\sum_{i=1}^n i^2=\frac{n(n+1)(2n+1)}{6}\)
\(\sum_{i=l}^{r} i^2=\sum_{i=1}^r i^2 -\sum_{i=1}^{l-1} i^2=\frac{r(r+1)(2r+1)}{6}-\frac{l(l-1)(2l-1)}{6}\)c++
#include<bits/stdc++.h> #define ll long long using namespace std; const ll mod=19940417,inv=3323403; ll n,m,l,r,t,p,q,ans=0,sum=0; ll sum1(ll l,ll r){return (r-l+1)*(r+l)/2%mod;}\\一次之和 ll sum2(ll x){return (x+1)*x%mod*(x+1+x)%mod*inv%mod;}\\平方之和 int main(){ scanf("%lld%lld",&n,&m),ans=n*n%mod,sum=m*m%mod; for(l=1;l<=m;l=r+1) r=m/(m/l),q=m/l,sum=(sum+mod-sum1(l,r)*q%mod)%mod;\\第一项 for(l=1;l<=n;l=r+1) r=n/(n/l),q=n/l,ans=(ans+mod-sum1(l,r)*q%mod)%mod;\\第二项 ans=ans*sum%mod,t=min(n,m),sum=n*m%mod*t%mod; for(l=1;l<=t;l=r+1) r=min(n/(n/l),m/(m/l)),p=m/l,q=n/l,sum=(sum+(sum2(r)-sum2(l-1)+mod)%mod*p%mod*q%mod+mod-sum1(l,r)*(n*p%mod+m*q%mod)%mod)%mod;\\第三项 ans=(ans-sum+mod)%mod,printf("%lld\n",ans); return 0; }