AtCoder初学者竞赛 300 D - AABCC
题目链接D - AABCC
D - AABCC
问题陈述
有多少个不大于N的正整数可以用a^2 bc^2表示,其中有三个质数a,b和c,使得a<b<c?
约束
N是满足300≤N≤10^12的整数。
输入
输入来自标准输入,格式如下:
N
输出
将答案打印为整数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 316228; // sqrt(10^12)
// 筛法求素数
vector<int> primes;
bool isPrime[MAXN+1];
void sieve()
{
fill(isPrime, isPrime+MAXN+1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= MAXN; i++) {
if (isPrime[i]) {
primes.push_back(i);
for (ll j = (ll)i*i; j <= MAXN; j += i) {
isPrime[j] = false;
}
}
}
}
// 计算a^2 * b * c^2小于等于n的方案数
ll count(ll n)
{
ll res = 0;
for (int i = 0; i < primes.size(); i++)
{
ll a = primes[i];
if (a*a*a*a > n) break; // a^4已经大于n了,后面的b和c不可能满足条件
for (int j = i+1; j < primes.size(); j++) {
ll b = primes[j];
if (a*b*b*b > n) break; // a^2 * b^3已经大于n了,后面的c不可能满足条件
for (int k = j+1; k < primes.size(); k++)
{
ll c = primes[k];
ll val = a*a*b*c*c;
if (val > n) break; // a^2 * b * c^2已经大于n了,后面的c不可能满足条件
res++;
}
}
}
return res;
}
int main()
{
sieve();
ll n;
cin >> n;
cout << count(n) << endl;
return 0;
}