題目鏈結
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...