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