浅谈powerful number
powerful number
定义:对于一个正整数 \(x={p_1}^{k_1}{p_2}^{k_2}{p_3}^{k_3}...{p_n}^{k_n}\),满足 \(\forall_{1\le i \le n},k_i>1\)。
性质1:所有 powerful number 都能被写成 \(a^2 b^3\) 的形式。
证明1:若 \(k_i\) 为偶数,就将其放入 \(a\) 中;若 \(k_i\) 为奇数,就将其放入 \(b\) 中,若有余数再将其放入 \(a\) 中。
性质2:在 \([1,n]\) 中有且存在 \(O(\sqrt n)\) 个 powerful number。
证明2:考虑积分证明,得到个数为 \(\int_{1}^{\sqrt n} \sqrt[3]{\frac{n}{x^2} } dx = 3n^{\frac{1}{2}} - 3n^{\frac{1}{3}}\),所以是 \(O(\sqrt n)\) 的。
PN 筛
找一个积性函数 \(g\) 与目标函数 \(f\) 在质数上值相同,即 \(\forall_p,f(p)=g(p)\),接着用 \(f=g * h\) 得到函数 \(h\),这个过程又叫拟合。PN 筛就是满足 \(f(p)=g(1)h(p)+g(p)h(1) =h(p)+g(p) \to h(p)=0\),所以只有在 powerful number 处才会有值,而只有 \(O(\sqrt n)\) 个这种值。
这就属于很板的题了,由于 \(f(p)=2\),所以会想到 \(d(p)=2\),这里 \(d\) 表示约数个数,然后拟合就行了,属于是板题中的板题了。
这里贴一个找 powerful number 的代码,就直接按定义去找就行了(\(op\) 表示是否是新的 powerful number)。
void powerful_number(int x,int p,int op){
if(x==cnt+1) return ;
if(pri[x]*pri[x]>n/p) return ;
powerful_number(x+1,p,0);
for(int k=pri[x]*pri[x];k<=n/p;k=k*pri[x]){
powerful_number(x+1,p*k,1);
if(k>n/p/pri[x]) break;
}
}