题目描述
求
∑i=1n∑j=1m(n mod i)×(m mod 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
解释:ans=(∑inn mod i)∗(∑jnn mod j)−∑imin(n,m)(n mod i)(n mod j),n mod ians=(\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 ians=(∑innmodi)∗(∑jnnmodj)−∑imin(n,m)(nmodi)(nmodj),nmodi拆成n−⌊ni⌋∗in-\lfloor\frac{n}{i}\rfloor*in−⌊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;
}
本文深入探讨了一种复杂的模运算求和算法,该算法旨在解决特定数学问题,即求解模19940417下特定形式的双重求和表达式。通过巧妙的数学转换和高效的代码实现,文章提供了一个清晰的解决方案,适用于不同规模的数据输入,从简单的个位数到十亿级别的数值。
4007

被折叠的 条评论
为什么被折叠?



