[NC14615] Number
| 12
 3
 
 | 时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 65536K,其他语言131072K
 64bit IO Format: %lld
 
 | 
题目描述
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)
输入描述
| 1
 | The input will consist of a integer n.
 | 
输出描述
| 1
 | You should output how many Shuaishuai numbers in [1...n]
 | 
输入
输出
说明
| 1
 | There is only one Shuaishuai number
 | 
题解
题目解析
我去,我以为是什么题呢,以为用什么数学方式.结果是打表+暴力= =,蚌.
思路是用欧拉筛把素数筛出来,然后暴力枚举.然后用unique算出不重复的个数,然后直接得出答案.不过唯一我学到了一个东西就是unique()函数.
AC代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 
 | #include <iostream>#include <algorithm>
 using namespace std;
 typedef long long ll;
 const int N = 5e7+10;
 const int PRIME = 1e5;
 
 int a[N],prime[PRIME],visit[PRIME];
 
 void work(){
 visit[1] = 1;
 for (int i = 2; i <= PRIME; i++){
 if (!visit[i])
 prime[++prime[0]] = i;
 for (int j = 1; j <= prime[0] && i * prime[j] <= PRIME; j++){
 visit[i * prime[j]] = 1;
 if (i % prime[j] == 0) break;
 }
 }
 return ;
 }
 
 int main(){
 int n,cunt=0;
 work();
 cin >> n;
 for(int i=1;i<=PRIME;i++){
 ll x = prime[i] * prime[i];
 if(x >= n) break;
 for(int j=1;j<=PRIME;j++){
 ll y = prime[j] * prime[j] * prime[j];
 if(y >= n) break;
 for(int k=1;k<=PRIME;k++){
 ll z = prime[k] * prime[k] * prime[k] * prime[k];
 if(z >= n) break;
 if(x+y+z <= n) a[cunt++] = x+y+z;
 }
 }
 }
 sort(a,a+cunt);
 cout << unique(a,a+cunt) - a << endl;
 return 0;
 }
 
 |