思路非常容易理解。通过线性筛求出 n 的立方根以内的质数,再枚举每一种质数的构造。
首先这种做法不会 TLE,10000 以内只有 1229 个质数。然而我的代码会WA,可以AC样例 1。
#include<bits/stdc++.h>
using namespace std;
const long long MOD = 1e7 + 7;
bool isPrime[100000010],boy[100000010];
int Prime[6000010], cnt = 0,ans;
map<long long,bool> MP;
void GetPrime(int n){ //线性筛素数(大概是没有问题的)
memset(isPrime, 1, sizeof(isPrime));
isPrime[1] = 0;
for(int i = 2; i <= n; i++){
if(isPrime[i]) Prime[++cnt] = i;
for(int j = 1; j <= cnt && i*Prime[j] <= n;j++){
isPrime[i*Prime[j]] = 0;
if(i % Prime[j] == 0) break;
}
}
}
int main(){
unsigned long long n;
cin>>n;
GetPrime(pow(n,1.0 / 3)); //求 n 的开3次根
for (int i = 1;i <= cnt;i++){
for (int j = i + 1;j <= cnt;j++){
for (int k = j + 1;k <= cnt;k++){
long long p = Prime[i] * Prime[i] * Prime[j] * Prime[k] * Prime[k];
if (p <= n && Prime[i] < Prime[j] && Prime[j] < Prime[k] && boy[i * j * k % MOD] == 0){
ans++;
boy[i * j * k % MOD] = 1; //哈希去重(?)
}
}
}
}
cout<<ans<<endl;
}
然而样例2得出的结果是正确结果的4倍左右,这是为什么?