HDU6069(思維 素數定理)

2021-08-04 23:03:06 字數 1266 閱讀 9201

比賽的時候有想到一次找所有數的乙個共同因數,結果沒有考慮素數的情況,想歪了,成了莫比烏斯反演。。。。。

素數定理:任意乙個數都可以表示為n=

pa11

pa22

…pak

k ,n的所有因子個數為(a

1+1)

(a2+

1)…(

ak+1

) ,然後對與每個在範圍內的質數,都進行一次遍歷,看是不是l-r中某些數的因子。

明白了同時對乙個質數都詢問是否是l~r中每個數的質數,大大提高了效率。明明能想到,卻還是差那麼一點,就是題刷的太少。。

code:

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define mem(a) memset(a,0,sizeof(a))

const

int eps=1e-8;

const

int maxn=1000010;//須填寫

const

int inf=0x3f3f3f3f;

const ll mod=998244353;

ll j,i;

ll l,r,k;

ll p[maxn];

int vis[maxn];

ll sum[maxn];

ll num[maxn];//因為區間大小最大為10^6所以maxn就夠了,不過輸入的時候要處理

void work(int snum)

sum[ii-l]=sum[ii-l]*(res*k+1)%mod;

sum[ii-l]%=mod;}}

}int main()

}int kase;

scanf("%d",&kase);

while(kase--)

//這裡如果直接從l開始,陣列會存不開

for(i=1;iif(p[i]*p[i]>r)

break;

work(p[i]);

//cout<}

ll res=0;

for(i=0;i<=r-l;i++)

//coutres%=mod;

}res%=mod;

cout

0;}

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...

HDU 6069 素數篩 分解質因子

給乙個起點為l終點為r的區間,求這個區間內的數的k次方的全部因子有多少個。設 n p1 c1 p2 c2.則d n k k c1 1 k c2 1 r l 1e6 先篩出10 6內的素數,再分解出 l,r 裡面的質因子,大於1e6的質數直接為 k 1 個因子。include using namesp...

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...