题目描述
求
∑ i = 1 n ∑ j = 1 m ( n   m o d   i ) × ( m   m o d   j ) , i ≠ j \sum_{i=1}^{n} \sum_{j=1}^{m} (n \bmod i) \times (m \bmod j), i \neq j ∑i=1n∑j=1m(nmodi)×(mmodj),i̸=j
mod 19940417 的值
输入格式
两个整数n m
输出格式
答案 mod 19940417
输入输出样例
输入 #1 复制
3 4
输出 #1 复制
1
输入 #2 复制
123456 654321
输出 #2 复制
116430
说明/提示
30%: n,m <= 1000
60%: n,m <= 10^6
100% n,m <= 10^9
解释: a n s = ( ∑ i n n   m o d   i ) ∗ ( ∑ j n n   m o d   j ) − ∑ i min ( n , m ) ( n   m o d   i ) ( n   m o d   j ) , n   m o d   i ans=(\sum_i^n n\bmod i)*(\sum_j^n n\bmod j)-\sum_i^{\min(n,m)}(n\bmod i)(n\bmod j),n\bmod i ans=(∑innmodi)∗(∑jnnmodj)−∑imin(n,m)(nmodi)(nmodj),nmodi拆成 n − ⌊ n i ⌋ ∗ i n-\lfloor\frac{n}{i}\rfloor*i n−⌊in⌋∗i,再分块搞一下就OK
#include<iostream>
#define mod 19940417
#define ll long long
#define inv2 9970209
#define inv6 3323403
using namespace std;
ll pow(ll a,ll b){
ll ret=1%mod;
while(b){
if(b&1) ret=ret*a%mod;
a=a*a%mod;b>>=1;
}
}
ll f(ll x){
return (1+x)%mod*x%mod*inv2%mod;
}
ll g(ll x){
return x%mod*(x+1)%mod*(2*x+1)%mod*inv6%mod;
}
ll cal(ll n){
ll ret=n%mod*n%mod;
for(int i=1,j;i<=n;i=j+1){
j=n/(n/i);
ret-=(n/i)*(f(j)-f(i-1))%mod;
ret%=mod;ret+=mod;ret%=mod;
}
return ret;
}
ll ok(ll n,ll m){
ll ret=n%mod*m%mod*min(n,m)%mod;
for(int i=1,j;i<=min(n,m);i=j+1){
j=min(n/(n/i),m/(m/i));
ret-=n%mod*(m/i)%mod*(f(j)-f(i-1))%mod;ret%=mod;ret+=mod;ret%=mod;
ret-=m%mod*(n/i)%mod*(f(j)-f(i-1))%mod;ret%=mod;ret+=mod;ret%=mod;
ret+=(n/i)%mod*(m/i)%mod*(g(j)-g(i-1))%mod;ret%=mod;
}
return ret;
}
ll n,m;
int main(){
cin>>n>>m;
ll ret=cal(n)*cal(m)%mod-ok(n,m)%mod;ret%=mod;ret+=mod;ret%=mod;
cout<<ret<<endl;
return 0;
}