题目大意:
求给定的函数值,其中 d (i ):i 的因子个数
解题思路:
设有 n=pa11∗pa22∗...∗pakk ,其中 n 的因子个数为: (a1+1)∗(a2+1)∗...∗(ak+1) 首先预处理出1-10^6里面所有的素数,然后枚举这些素数,在枚举[L,R]区间中这些素数的倍数,然后根据这些倍数进行素因子分解,其实就是统计[L,R]区间中有多少个枚举的素数,然后乘以K, 在加 1 计算即可。在枚举 [L,R]区间值的时候,我们需要先把 [L,R] 区间中的数用数组保存下来,然后通过数组进行素因子分解。 #include <bits/stdc++.h> using namespace std; typedef long long LL; const LL MOD = 998244353; const LL MAXN = 1e6 + 5; int prime[MAXN], cnt; LL p[MAXN]; void isprime() { memset(prime, 0, sizeof(prime)); cnt = 0; prime[1] = 1; for (LL i = 2; i < MAXN; i++) { if (!prime[i]) { p[cnt++] = i; for (LL j = i * i; j < MAXN; j += i) { prime[j] = 1; } } } } LL f[MAXN], num[MAXN]; int main() { isprime(); int T; scanf("%d", &T); while (T--) { LL L, R, K; scanf("%lld%lld%lld", &L, &R, &K); LL ans = 0; if (L == 1) { ans = 1, L++; } int t = R - L; for (int i = 0; i <= t; i++) { f[i] = i + L, num[i] = 1; } for (int i = 0; i < cnt && p[i]*p[i] <= R; i++) { LL tmp = L; if (L % p[i]) { tmp = (L / p[i] + 1) * p[i]; } for (LL j = tmp; j <= R; j += p[i]) { LL cnt = 0; while (f[j - L] % p[i] == 0) { cnt++; f[j - L] /= p[i]; } num[j - L] = num[j - L] * (cnt * K + 1) % MOD; } } for (int i = 0; i <= t; i++) { if (f[i] == 1) { ans = (ans + num[i]) % MOD; } else { ans = (ans + num[i] * (K + 1)) % MOD; } } printf("%lld\n", ans); } return 0; }