// C++ 自定义哈希函数 使用示例template<classT>structCustomHash{size_toperator()(Tx)const{staticconstsize_t_prime=0x9e3779b97f4a7c15;size_t_hash_value=std::hash<T>()(x);return_hash_value^(_hash_value>>30)^_prime;}};// 示例std::unordered_map<int,int,CustomHash<int>>f1;std::unordered_map<longlong,int,CustomHash<longlong>>f2;std::unordered_map<std::string,int,CustomHash<longlong>>f3;
structPrimesCount{intn;vector<int>pre,vis;PrimesCount(intn):n(n),pre(n+1),vis(n+1){eulerFilter();}voideulerFilter(){// O(n)vector<int>primes;for(inti=2;i<=n;i++){if(!vis[i]){primes.push_back(i);pre[i]=pre[i-1]+1;}else{pre[i]=pre[i-1];}for(intj=0;primes[j]<=n/i;j++){vis[primes[j]*i]=true;if(i%primes[j]==0){break;}}}}voideratosthenesFilter(){// O(nloglogn)for(inti=2;i<=n;i++){if(!vis[i]){pre[i]=pre[i-1]+1;for(intj=i;j<=n;j+=i){vis[j]=true;}}else{pre[i]=pre[i-1];}}}voidsimpleFilter(){// O(nlogn)for(inti=2;i<=n;i++){if(!vis[i]){pre[i]=pre[i-1]+1;}else{pre[i]=pre[i-1];}for(intj=i;j<=n;j+=i){vis[j]=true;}}}};/* 使用示例PrimesCount obj(n); // construct an objectcout << obj.pre[n] << "\n"; // pre[i] means prime numbers in range of [1, i]*/