【bzoj2956】模积和 数论+分块

题目描述

求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j。

输入

第一行两个数n,m。

输出

一个整数表示答案mod 19940417的值

样例输入

3 4

样例输出

1



题解

数论+分块

由于直接求i≠j的情况比较难搞,所以我们可以先求出i可以等于j的和,然后再减去i等于j时的情况。

也就是求∑∑((n mod i)*(m mod j))-∑((n mod i)*(m mod i))。

然后再根据乘法分配律转化为∑(n mod i)*∑(m mod i)-∑((n mod i)*(m mod i))。

因为有n mod i = n-(n/i)*i(这里的除号均表示向下取整)。

所以∑(n mod i) = ∑(n-(n/i)*i) = n*n-∑((n/i)*i)。

这里n/i最多只有√n 种取值,我们可以分块来求,这里用到1,2,3,...,n的和。

后面一坨变为∑((n-(n/i)*i)*(m-(m/i)*i))=∑(nm-m*(n/i)*i-n/(m/i)*i+(n/i)*(m/i)*i^2)。

同样的方法处理,运用一下1^2,2^2,3^2,...,n^2的和。

最后减一下即可。

然而有一个问题,就是套用公式的时候需要除法,不能先取模,而不先取模还会爆long long。

好在除的数是固定的2和6,于是可以直接把mod开大6倍,最后再模回去即可。

#include <cstdio>
#include <algorithm>
#define MOD 119642502
using namespace std;
typedef long long ll;
ll sum1(ll p)
{
	return p * (p + 1) % MOD / 2;
}
ll sum2(ll p)
{
	return p * (p + 1) % MOD * (2 * p + 1) % MOD / 6;
}
ll calc1(ll n)
{
	ll ans = n * n % MOD , i , last = 0;
	for(i = 1 ; i <= n ; i = last + 1)
	{
		last = n / (n / i);
		ans = (ans - (n / i) % MOD * (sum1(last) - sum1(i - 1) + MOD) % MOD + MOD) % MOD;
	}
	return ans;
}
ll calc2(ll n , ll m)
{
	ll ans = n * m % MOD * min(n , m) % MOD , i , last = 0;
	for(i = 1 ; i <= n && i <= m ; i = last + 1)
	{
		last = min(n / (n / i) , m / (m / i));
		ans = (ans - m * (n / i) % MOD * (sum1(last) - sum1(i - 1) + MOD) % MOD
		           - n * (m / i) % MOD * (sum1(last) - sum1(i - 1) + MOD) % MOD
		           + (n / i) * (m / i) % MOD * (sum2(last) - sum2(i - 1) + MOD) % MOD + 2 * MOD) % MOD;
	}
	return ans;
}
int main()
{
	ll n , m;
	scanf("%lld%lld" , &n , &m);
	printf("%lld\n" , (calc1(n) * calc1(m) % MOD - calc2(n , m) + MOD) % (MOD / 6));
	return 0;
}
时间: 2024-11-02 23:35:43

【bzoj2956】模积和 数论+分块的相关文章

bzoj2956 模积和

Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表示答案mod 19940417的值 Sample Input 3 4 Sample Output 1 样例说明答案为(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod 1) * (4 mod 4) + (3 mod 2) * (4 mod 1) + (3 mod

ACM学习历程—BZOJ2956 模积和(数论)

Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表示答案mod 19940417的值 Sample Input 3 4 Sample Output 1 样例说明 答案为(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod 1) * (4 mod 4) + (3 mod 2) * (4 mod 1) + (3 mod

[Bzoj 2956] 模积和 (整除分块)

整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数列求和或对于积性函数的筛法等,然后就可以用整除分块的思想做. 题目解法 化公式变成比较方便的形式: \(\ \sum_{i = 1}^n \sum_{j = 1}^m (n \mod i)(m \mod j), i \ne j\) \(= \sum_{i = 1}^n \sum_{j = 1}^m

BZOJ 2956 模积和(分块)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2956 [题目大意] 求∑∑((n%i)*(m%j))其中1<=i<=n,1<=j<=m,i≠j. [题解] $∑_{i=1}^{n}∑_{j=1}^{m}((n\mod i)*(m\mod j))(i≠j)$ $=∑_{i=1}^{n}∑_{j=1}^{m}(n-\lfloor n/i\rfloor*i)*(m-\lfloor m/j\rfloor*j)-∑_{i=1}

数论分块 【数学】

数论分块 数论分块也是很重要哦(dalao说以后莫比乌斯反演要用到) 经典栗子: for i=1~n  求 ∑x=(n/i)  (注:这里()表示为下取整) 普通人一般暴力,复杂度 O(n) 这里就要用到数论分块. 我们可以模拟一下, 发现 x 在一定的区间内值不变. 这里就可以分块了.把值不变的每一块左端点.右端点算出来,就可以等差数列一起求和了. 这只是数论分块入门应用,后续待填坑... 推荐裸题:BZOJ2956 模积和 原文地址:https://www.cnblogs.com/Frank

【BZOJ2956】模积和 分块

[BZOJ2956]模积和 Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表示答案mod 19940417的值 Sample Input 3 4 Sample Output 1 样例说明 答案为(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod 1) * (4 mod 4) + (3 mod 2) * (4 m

BZOJ 2956: 模积和

题目 2956: 模积和 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 554  Solved: 257[Submit][Status] Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表示答案mod 19940417的值 Sample Input 3 4 Sample Output 1 样例说明 答案为(3

【BZOJ1257】余数之和(数论分块,暴力)

[BZOJ1257]余数之和(数论分块,暴力) 题解 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7 Input 输入仅一行,包含两个整数n, k. Output 输出仅一行,即j(n, k). Sample Input

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

传送门:here 一句话题意:求$ \sum\limits_{i=1}^n\sum\limits_{j=1}^m(n\ mod\ i)(m\ mod\ j)$,$ i \neq j$ 简化题意:                                                                                           假设$ n<m$ 我们令$ f(x)$表示$ \sum\limits_{i=1}^x\ x\ mod\ i$,$ f2(x,