思路:設
n=p_1^p_2^...p_m^n=
p1
c1
p
2c
2
..
.pm
cm
,則d(n^k)=(kc_1+1)(kc_2+1)...(kc_m+1)d(
n)=
(c1
+1
)(c2
+1).
..(c
m+1)
則 d(n^k)=(kc_1+1)(kc_2+1)...(kc_m+1)d(
nk
)=(
kc1
+1
)(kc
2
+1).
..(k
cm
+1)。
先打出一百萬以內的素數表,列舉每乙個素數p,然後再列舉[l, r]區間內p的倍數,將其因式分解,那麼因式分解完了之後,區間內的數要麼是1,要麼是乙個超過一百萬的素數。
這個題姿勢一定要對,不能列舉[l,r]內的數,再去分解因式,這樣很容易會超時。
#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e6 + 20;
const double eps = 1e-5;
const int mod = 998244353;
typedef unsigned long long ull;
typedef long long ll;
int dx = ;
int dy = ;
ll n;
int prime[maxn];
int vis[maxn];
ll g[maxn], f[maxn];
int tot;
void init()
}}ll l ,r;
int k;
void cal(int x)
}}int main()
ll ans = 0;
for(int i = 0; i <= r - l; ++i)
printf("%lld\n", ans);
}}/*
*/
hdu6069 素數篩法 2017多校4
對於 l r 內的每個數,根據唯一分解定理有 所以有 因為 可根據唯一分解定理推導 所以題目要求 就可以運用它到上述公式 注意不能暴力對l,r內的數乙個個分解算貢獻,而應該列舉l,r區間內質數的倍數 hdu6069 素數篩法 2017多校3 include using namespace std t...
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...
HDU6069 篩法 有新技巧
題目鏈結 解題思路 這道題是這是暑假集訓我debug時間最長的一道題,從昨天下午到今天中午。剛開始的時候直接列舉的l r之間的所有數的質因數,然後就tle了,後來我就看了一下題解,發現了一種優化方法,暴力的做法是把l r每個數的質因數都找一遍,這樣比如l r是1 8,4找過質因數2,6也找過質因數2...