LOJ 6053 簡單的函式 Min 25篩

2022-04-02 14:48:03 字數 1303 閱讀 6055

題目鏈結

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(2)\)就是\(2+1=3\)了。

不妨先把\(f(2)\)也看做\(f(2)=p-1\)。

這樣\(f(p)=p-1\),但還不是積性函式,但是我們可以拆成兩個積性函式的和:\(f(p)=g(p)-h(p)\),其中\(g(p)=p,\ h(p)=[p是質數]\)。分別計算這兩個函式的字首和。

然後,首先計算初值\(g(n,0)\),把所有合數看做質數,那麼\(g(n),h(n)\)的字首和也就是初值分別是\(\frac-1\),\(n-1\)(不考慮\(f(1)\))。

然後計算\(g(x,|p|)\)。在外層列舉\(j\)把第二維滾動掉。

另外每次從\(\frac\)轉移,都是整除,結果只有\(o(sqrt(n))\)種(好像是\(2sqrt(n)\)?不知道為什麼...),所以可以先離散化。

然後套式子得到\(g(x,|p|)\)。

然後套式子計算\(s(n,1)\)。當\(j=1\)時給結果加個\(2\),因為\(f(p_1)=f(2)\)是按\(2-1=1\)計算的,應該是\(3\)。

這裡直接遞迴算就行了,而且不需要記憶化。

//1214ms	4.12m

#include #include #include #define mod 1000000007

#define mod(x) x>=mod&&(x-=mod)

typedef long long ll;

const int n=2e5+5;

int sqr,cnt,p[n>>2],sp[n],id1[n],id2[n],g[n],h[n];

ll n,w[n];

bool notp[n];

void init(int n) }}

int s(ll x,int y)

return res%mod;

} main()

p[cnt+1]=1e9, w[m+1]=-1;

for(int j=1; j<=cnt; ++j) }

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

return 0;

}

loj6053 簡單的函式 min25篩

對於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的字首和 兩個陣列求法是一樣的,然後第...

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

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