ABC D?
  • 板块学术版
  • 楼主HopesandDreams
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/4/29 22:09
  • 上次更新2023/10/23 17:12:29
查看原帖
ABC D?
757597
HopesandDreams楼主2023/4/29 22:09

思路非常容易理解。通过线性筛求出 nn 的立方根以内的质数,再枚举每一种质数的构造。

首先这种做法不会 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倍左右,这是为什么?

2023/4/29 22:09
加载中...