【BZOJ 2693】jzptab

本文介绍了一个使用C++实现的数论问题解决方案,通过埃拉托斯特尼筛法预处理质数和特定数论函数,解决了一类与整除性质有关的问题。文章详细展示了如何高效计算特定数论函数的前缀和,并通过快速幂取模优化了大量乘法运算,避免了整数溢出。此外,还分享了在代码调试过程中遇到的常见错误和解决策略。

莫名其妙地又卡在long long上了,我果然又在同一个地方犯逗。

在“在路上,同梦行”群里闹了个大笑话QAQ

#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x=getint()
using namespace std;
typedef long long LL;
const int p = 1E8 + 9;
const int N = 1E7 + 3;
int getint() {
	int k = 0, fh = 1; char c = getchar();
	for(; c < '0' || c > '9'; c = getchar())
		if (c == '-') fh = -1;
	for(; c >= '0' && c <= '9'; c = getchar())
		k = k * 10 + c - '0';
	return k * fh;
}
bool np[N];
int prime[N];
LL g[N], sum[N];
void shai() {
	g[1] = 1; sum[1] = 1; int num = 0;
	for(int i = 2; i <= 1E7; ++i) {
		if (!np[i]) {
			prime[++num] = i;
			g[i] = ((LL)i - (LL)i * i) % p;
		}
		for(int j = 1; j <= num; ++j) {
			LL t = prime[j] * i;
			if (t > 1E7) break;
			np[t] = 1;
			if (i % prime[j] == 0) {g[t] = (prime[j] * g[i]) % p; break;}
			g[t] = (g[prime[j]] * g[i]) % p;
		}
		sum[i] = (sum[i - 1] + g[i]) % p;
	}
}
LL S(LL x, LL y) {return (x * (x + 1) / 2 % p) * (y * (y + 1) / 2 % p) % p;}
int main() {
	int T, n, m;
	shai();
	read(T);
	while (T--) {
		read(n); read(m);
		if (n > m) swap(n, m);
		LL ret = 0;
		for(int i = 1, la = 1; i <= n; i = la + 1) {
			la = min(n / (n / i), m / (m / i));
			ret = (ret + (sum[la] - sum[i - 1]) * S(n / i, m / i) % p) % p;
		}
		printf("%lld\n", (ret + p) % p);
	}
	return 0;
}

QuQ

转载于:https://www.cnblogs.com/abclzr/p/5428021.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值