求卡常
查看原帖
求卡常
1074696
tmlrock楼主2025/8/1 16:32
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e7 + 10;
typedef long long ll;

ll k_d[MAXN];
bool is_prime[MAXN];
int prime[700000];
int cnt = 0;
ll n, d, q, l, r;
const ll MOD = 1e9 + 7;

inline ll mod(ll a) {
	return a >= MOD ? a - MOD : a;
}
inline ll qpow(ll a) {
	if (a == 0) return 0;
	unsigned exp = d;
	ll res = 1;
	for (; exp; exp >>= 1) {
		if (exp & 1) res = res * a % MOD;
		a = a * a % MOD;
	}
	return res;
}

inline ll F(ll x) {
	if (x <= 0) return 0;
	ll res = 0;
	for (register ll l = 1, r; l <= x; l = r + 1) {
		r = x / (x / l);
		res = (res + (k_d[r] - k_d[l - 1] + MOD) * (x / l)) % MOD;
	}
	return res;
}

int main() {
	scanf("%d%lld%d", &n, &d, &q);
	d %= (MOD - 1);
	is_prime[1] = true;
	k_d[1] = 1;
	for (register int i = 2; i <= n; ++i) {
		if (!is_prime[i]) {
			prime[cnt++] = i;
			k_d[i] = qpow(i);
		}
		for (register int j = 0; j < cnt; ++j) {
			if (prime[j] * i > n) break;
			is_prime[prime[j] * i] = false;
			k_d[prime[j] * i] = k_d[i] * k_d[prime[j]] % MOD;
			if (i % prime[j] == 0) break;
		}
	}
	for (register int i = 1; i <= n; ++i)
		k_d[i] = mod(k_d[i] + k_d[i - 1]);
	while (~scanf("%d%d", &l, &r))
		printf("%lld\n", mod(F(r) - F(l - 1) + MOD));
	return 0;
}
2025/8/1 16:32
加载中...