P2260 [清华集训2012]模积和
题目
求
\[\large \sum_{i=1}^{n}\sum_{j=1 \land i \not = j}^{m}(n\ mod\ i)(m\ mod\ j)
\]
分析
稍微转化一下(也就是把相同的减掉,然后把模按照意义直接拆开)
\[\large =\sum_{i=1}^{n}\sum_{j=1}^{m}(n-{\left \lfloor \frac{n}{i} \right \rfloor}i)(m-{\left \lfloor \frac{m}{j} \right \rfloor}j)
\]
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define inc(x,y,mod) (((x)+(y))>=(mod)?(x)+(y)-(mod):(x)+(y))
#define dec(x,y,mod) ((x)-(y)<0?(x)-(y)+(mod):(x)-(y))
#define rep(i,x,y) for(int i=(x);i<=(y);i++)
#define dep(i,y,x) for(int i=(y);i>=(x);i--)
const int N=5e4+5,M=2e5+5,MOD=1e9+7,mod=19940417;
ll n,m,ans,s1,s2,s3;
ll sum(ll a,ll b){return (b-a+1)*(a+b)/2%mod;}
ll sum2(ll x){return x*(x+1)%mod*(2*x+1)%mod*3323403%mod;}
ll Calc(ll n){ll tmp=0;for(ll i=1,j;i<=n;i=j+1){j=n/(n/i);tmp=(tmp+n*(j-i+1)%mod-sum(i,j)*(n/i))%mod;}return (tmp+mod)%mod;}
signed main(){
cin>>n>>m;
ans=Calc(n)*Calc(m)%mod;
if(n>m)swap(n,m);
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
s1=n*m%mod*(j-i+1)%mod;
s2=(n/i)*(m/i)%mod*(sum2(j)-sum2(i-1)+mod)%mod;
s3=(n/i*m+m/i*n)%mod*sum(i,j)%mod;
ans=(ans-(s1+s2-s3)%mod+mod)%mod;
}
cout<<ans;
return 0;
}