題意: 給出 l, r, k.求:(lambda d(i^k))mod998244353,其中 l <= i <= r, d(i) 為 i 的因子個數.
思路:若 x 分解成質因子乘積的形式為 x = p1^a1 * p2^a2 * ... * pn^an,那麼 d(x) = (a1 + 1) * (a2 + 1) * ... * (an + 1) .顯然 d(x^k) = (a1 * k + 1) * (a2 * k + 1) * ... * (an * k + 1) .
但如果僅僅以此暴力求解的話是會 tle 的, 需要用下區間素數篩法並且在篩選區間內合數時將其質因分解,將 i 對答案的貢獻儲存到 sum 陣列中,然後再遍歷一次統計素數對答案的貢獻並將所有貢獻累加起來即可.
**:
1 #include 2 #include 3 #includeview code4#define ll long long
5using
namespace
std;67
const
int maxn = 1e6 + 10;8
const
int mode = 998244353;9
intprime[maxn], tag[maxn], tot;
10ll sum[maxn], gel[maxn];
1112
void get_prime(void)19
}20}21
}2223ll max(ll a, ll b)
2627
int main(void)38
for(int i = 0; i < tot; i++)
46 sum[j - l] = sum[j - l] * (cnt * k + 1 %mode);
47if(sum[j - l] >= mode) sum[j - l] %=mode;48}
49}50 ll sol = 0;51
for(int i = 0; i <= r - l; i++)
56 printf("
%lld\n
", sol);57}
58return0;
59 }
(∑i=lrd(ik))mod998244353
(∑i=lrd(ik))mod998244353
(∑i=lrd(ik))mod998244353
hdu6069 區間素數篩
hdu6069 counting divisors 傳送門題意 計算 sum d i k mod 998244353 其中 d n 表示 n 的約數個數,其中 1 leq l leq r leq 1e12,r l leq 1e6,1 leq k leq 1e7 題解 根據唯一分解定理 n p 1 p...
HDU 6069 素數篩法
思路 設 n p 1 p 2 p m n p 1 c 1 p 2 c 2 p m c m 則d n k kc 1 1 kc 2 1 kc m 1 d n c 1 1 c2 1 c m 1 則 d n k kc 1 1 kc 2 1 kc m 1 d n k kc 1 1 kc 2 1 k c m 1...
HDU6069(思維 素數定理)
比賽的時候有想到一次找所有數的乙個共同因數,結果沒有考慮素數的情況,想歪了,成了莫比烏斯反演。素數定理 任意乙個數都可以表示為n pa11 pa22 pak k n的所有因子個數為 a 1 1 a2 1 ak 1 然後對與每個在範圍內的質數,都進行一次遍歷,看是不是l r中某些數的因子。明白了同時對...