一个筛子
做法:
-
求:\(\displaystyle \sum_{i=2}^{n} f(i)\),\(i\in prime\)
-
初始时:S[x]=\(\displaystyle \sum_{i=2}^{x} f(i)\)
-
for prime:primelist
- for x in range[n,sqrt(p)]
- S[x]-=(S[x/p]-S[p-1])*\(f(x)\)
代码(HDU 6889):
#include
#include
#include
#include
#include
#include
#include
#include
耗时
使用i7-10710U,输入的n为1e10时,ans函数执行平均需要约83ms,稍作优化即可达到48ms,HDU 6889实测514MS!
代码(HDU 5901)
#include
#include
#include
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uint;
constexpr uint maxm=sqrt(1e11)+1;//maxn=1e12
uint primelist[maxm],pcnt=0;
bool isnprime[maxm];
double inv[maxm];
inline void init(){
constexpr uint m=maxm-1;
primelist[++pcnt]=2;
for(uint i=1;i<=m;++i)inv[i]=1.0/i;
for(uint j=4;j<=m;j+=2)isnprime[j]=true;
for(uint i=3;i<=m;i+=2){
if(!isnprime[i]){
primelist[++pcnt]=i;
// i*i may overflow
for(ull j=(ull)i*i;j<=m;j+=i)
isnprime[j]=true;
}
}
return ;
}
uint a[maxm];
ull b[maxm];
inline ull n34divlognsieve(const ull n) {
if (n<=1) return 0;
const uint m=sqrt(n);
constexpr double eps=1e-7;
for(uint i=2;i<=m;++i)a[i]=a[i-1]+1;//sum
for(uint i=1;i<=m;++i)b[i]=n/i-1;//sum
const uint pt=upper_bound(primelist+1,primelist+1+pcnt,m)-primelist;
for(uint r=1;r=prime*prime;--i)
a[i]-=(a[(uint)(i*inv[prime]+eps)]-a[prime-1]);
}
return b[1];
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
init();
ull n;
while(cin>>n){
cout<