洛谷-2260 [清华集训2012]模积和

题目描述

∑ 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=1nj=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 &VeryThinSpace; m o d &VeryThinSpace; i ) ∗ ( ∑ j n n &VeryThinSpace; m o d &VeryThinSpace; j ) − ∑ i min ⁡ ( n , m ) ( n &VeryThinSpace; m o d &VeryThinSpace; i ) ( n &VeryThinSpace; m o d &VeryThinSpace; j ) , n &VeryThinSpace; m o d &VeryThinSpace; 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 nini,再分块搞一下就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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值