BZOJ2956 模积和

[Solution]

The original equation equals to: sigma(n % i) * sigma(m % j) - sigma((n % i) * (m % i)). That's the solution to it. You need to divide them into sqrt(n) parts by merging each equal (n % i) and (m % i).

Another useful equation is that 1^2 + 2^2 + ... + n^2 = n * (n + 1) * (2 * n + 1) / 6.

Be careful that 19940417 is not a prime number.


[Code]

#include <cstdio>
#include <algorithm>
#include <memory.h>

using namespace std;

typedef long long qw;

#ifdef WIN32
#define lld "%I64d"
#else
#define lld "%lld"
#endif
#define _l (qw)

const int mod = 19940417;
const int inv2 = 9970209;
const int inv6 = 3323403;

inline qw sqs(qw n) {
	return n * (n + 1) % mod * (n * 2 + 1) % mod * inv6 % mod;
}

inline qw sqn(qw n) {
	return (n + 1) * n % mod * inv2 % mod;
}

qw sovo(qw n) {
	qw s = n * n;
	for (qw i = 1, j; i <= n; i = j + 1) {
		j = n / (n / i);
		s -= (j - i + 1) * (i + j) / 2 * (n / i);
	}
	return s % mod;
}

qw sovt(qw n, qw m) {
	qw e = min(n, m);
	qw s = m * n % mod * e % mod;
	for (qw i = 1, j; i <= e; i = j + 1) {
		j = min(n / (n / i), m / (m / i));
		s -= (n * (m / i) + m * (n / i)) % mod * (sqn(j) - sqn(i - 1)) % mod;
		s += (n / i) * (m / i) % mod * (sqs(j) - sqs(i - 1) + mod) % mod;
		s %= mod; 
		if (s < 0)
			s += mod;
	}
	return s;
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
#endif

	qw n, m, ans;
	scanf(lld lld, &n, &m);
	ans = (sovo(n) * sovo(m) % mod - sovt(n, m) + mod) % mod;
	printf("%d\n", (int)ans);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值