loj6053 簡單的函式 min25篩

2021-10-24 02:32:53 字數 1500 閱讀 7534

對於100%的資料,n<=1e10

首先,考慮質數,即c=1的情形,f(2)=3,其餘f(p)=p-1,

這裡就先統一f(p)=p-1處理,然後對第乙個質數特判加2

由於f(p)=p-1,所以這裡拆成兩部分,

g用來算前面一項,質數p的字首和,h用來算後面一項,質數的個數即1的字首和

兩個陣列求法是一樣的,然後第二維可以根據增序迭代滾動掉

那麼即把所有數都先當質數來算,求得乙個假的值,後續再不斷的迭代,把那些合數的減掉

初始時,

實際上,本題只用到第二行的式子,且根據g的定義,

根據這個固定轉移式,發現需要n/pj的值,那麼套一下數論分塊,

先把第一維的值弄出來,個數約為

則用id1和id2記錄一下這些下標,相當於存到兩個大小為

for (ll l = 1, r; l <= n; l = r + 1)
然後,正序處理g,迭代|p|次,即tot次,

最後的g[c]為g(n,|p|),即為所求,

for (int j = 1; j <= tot; ++j) 

}

然後,考慮求s,這裡採用遞迴,並且不需要記憶化

先考慮一下s(n,j)的初值,也就是所有滿足條件的質數的答案

前期做題還不熟練,把概念再粘過來

即這個答案是

然後根據

需要列舉後面兩層sum,即一層最小質因子pk,另一層是其冪次e,遞迴求答案

然後j=1時,需要把質數為2的特殊考慮,把和式的值+2

loj神奇的自動縮排

#include #include #include #include #include #include using namespace std;

typedef long long ll;

const int n = 2e5 + 10, mod = 1e9 + 7, inv2 = (mod + 1) / 2;

ll n, sqr, w[n];

ll pri[n], id1[n], id2[n], h[n], g[n], c;

bool zs[n];

int tot, sp[n];

void pre(int n)

for (int j = 1; j <= tot && i * pri[j] <= n; ++j)

}}int s(ll x, int y)

}return ret;

}int main()

for (int j = 1; j <= tot; ++j)

}int ans = s(n, 1) + 1;

printf("%d\n", (ans + mod) % mod);

return 0;

}

Loj 6053 簡單的函式 Min25篩

定義乙個積性函式 f p c p xor c 求 sum nf i 異或這個東西不太好搞,要考慮怎麼求出 g 陣列。當 p 為質數時 f p p 1 所以我們讓 g n sum n i in pri i 1 就好了。然後因為 i 1 不是完全積性函式,所以拆成 i 和 1 分開來就好了。然後因為 f...

LOJ 6053 簡單的函式 Min 25篩

題目鏈結 min 25篩見這裡 給定 n 求積性函式 f p c p oplus c 的字首和。oplus 表示異或運算。n leq 10 所求積性函式為 f p c p oplus c,quad p in prime 先考慮質數的貢獻。因為除 2 以外的質數 p 都是奇數,所以 f p p 1 f...

LOJ6053 簡單的函式(min 25篩)

題目大意 從前有個積性函式 f 滿足 f 1 1,f p k p oplus k 異或 求其前 n 項的和對 10 9 7 取模的值。1 le n le 10 這種奇怪但是簡潔的積性函式求和,首選 min 25 篩。首先可以發現,對於質數 p p ge 3 時 f p p 1 p 2 時 f p p...