hdu6069 簡單數學 區間素數篩法

2022-02-19 18:18:57 字數 1214 閱讀 1588

題意: 給出 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 #include 

4#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 }

view code

(∑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中某些數的因子。明白了同時對...