hdu6069 區間素數篩

2022-06-08 15:30:10 字數 1124 閱讀 2265

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_2^*p_3^*...*p_m^\)

所以\(d(n)=(c_1+1)*(c_2+1)*(c_3+1)*...*(c_m+1)\)

所以\(d(n^k)=(kc_1+1)*(kc_2+1)*(kc_3+1)*...*(kc_m+1)\)

所以就是對\([l,r]\)區間中的每乙個數進行質因數分解,可以通過區間素數篩計算每乙個素數的貢獻

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define pii pair#define pll pair#define pli pair#define pi acos(-1.0)

#define eps 1e-6

#define lowbit(x) x&(-x)

using namespace std;

const int maxn=1e6+10,mod=998244353;

int t;

bool is_prime[maxn];

ll l,r,k,ans[maxn],cur[maxn];

void segment_sieve(ll a,ll b)

for(ll j=(a+i-1)/i*i;j<=b;j+=i)

cnt=cnt*k%mod;

ans[j-a]=ans[j-a]*(cnt+1)%mod;

}} }

for(int i=0;i<=b-a;i++) }}

int main()

printf("%lld\n",res);

}}

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 簡單數學 區間素數篩法

題意 給出 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...

hdu 6069 素數篩 區間質因數分解

給 l,r 區間的每乙個數都質因數分解的複雜度可以達到 r l logr,真的漲姿勢 另外,質因數分解有很重要的一點,就是只需要打sqrt r 以內的素數表就夠了 因為超過sqrt r 的至多只有乙個,分解其他的那些剩下的就是了。果然學習的過程中要精益求精,把時間和空間都盡量降到最低。此外還有乙個很...