题目描述
We define Shuaishuai-Number as a number which is the sum of a prime square(平方), prime cube(立方), and prime fourth power(四次方).
The first four Shuaishuai numbers are:
How many Shuaishuai numbers in [1,n]? (1<=n<=50 000 000)
输入描述:
The input will consist of a integer n.
输出描述:
You should output how many Shuaishuai numbers in [1...n]
示例1
输入
28
输出
1
说明
There is only one Shuaishuai number
链接:https://ac.nowcoder.com/acm/problem/14615
来源:牛客网
分析:
本题n的数据范围是1到5000万,大约估计一下,用到的素数小于8000,因为8000的平方为6400万,7000的平方为4900万,无聊实测,素数打表到7070即可,即用到的素数最大为7069,所以本题直接暴力即可,有人打表到10的7次方级别,花了大约1500ms,而打表到7070只花了101ms。
打完素数表,直接三重循环,每当当前的素数的2 ~ 4次方大于所给的数时,就break,当然,打表也可以,不过本题是单个样例,不用担心超时,然后用sort一下,用unique去重即可。
有看到别人使用dfs,只不过要慢很多。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 7070;
const int M = 5e7 + 7;
int vis[N];
int prime[N];
int tot;
int ans[M];
void init()
{
for (int i = 2; i < N; i ++){
if (!vis[i]){
prime[tot ++] = i;
for (int j = 2 * i; j < N; j += i)vis[j] = 1;
}
}
}
int solve(int n){
int cnt = 0;
for (int i = 0; i < tot; i ++){
ll x = prime[i] *prime[i];
if (x >= n)break;
for (int j = 0; j < tot; j ++){
ll y = prime[j] * prime[j] * prime[j];
if (y >= n)break;
for (int k = 0; k < tot; k ++){
ll z = prime[k] *prime[k] * prime[k] * prime[k];
if (z >= n)break;
if (x + y + z <= n)ans[cnt ++] = x + y + z;
}
}
}
sort(ans, ans + cnt);
cnt = unique(ans, ans + cnt) - ans;
return cnt;
}
int main()
{
init();
int n;
cin >> n;
cout << solve(n) << endl;
return 0;
}