码迷,mamicode.com
首页 > 其他好文 > 详细

湖南大学ACM程序设计新生杯大赛(同步赛)D - Number

时间:2017-12-24 21:23:54      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:numbers   amp   init   tput   -o   prime   tin   define   设计   

题目描述

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

题解

暴力打标。

把所有满足要求的数组都存进数组,排序后去重,每次询问二分即可。

#include <cstdio>
#include <algorithm>
using namespace std;
 
const int maxn = 50000000;
int a[1200000 + 10];
int sz = 0, cnt = 0;
int b[1200000 + 10];
bool noprime[maxn + 10];
int n;
 
void init() {
  noprime[1] = 1;
  for(int i = 2; i <= maxn; i ++) {
    if(noprime[i]) continue;
    for(int j = i + i; j <= maxn; j = j + i) {
      noprime[j] = 1;
    }
  }
  for(int i = 1; i * i <= maxn; i ++) {
    if(noprime[i]) continue;
    for(int j = 1; i * i + j * j * j <= maxn; j ++) {
      if(noprime[j]) continue;
      for(int k = 1; i * i + j * j * j + k * k * k * k <= maxn; k ++) {
        if(noprime[k]) continue;
        a[sz ++] = i * i + j * j * j + k * k * k * k;
      }
    }
  }
  sort(a, a + sz);
  b[cnt ++] = a[0];
  for(int i = 1; i < sz; i ++) {
    if(a[i] == a[i - 1]) continue;
    b[cnt ++] = a[i];
  }
}
 
int main() {
  init();
  while(~scanf("%d", &n)) {
    int L = 0, R = cnt - 1, pos = -1;
    while(L <= R) {
      int mid = (L + R) / 2;
      if(b[mid] <= n) pos = mid, L = mid + 1;
      else R = mid - 1;
    }
    printf("%d\n", pos + 1);
  }
  return 0;
}

  

湖南大学ACM程序设计新生杯大赛(同步赛)D - Number

标签:numbers   amp   init   tput   -o   prime   tin   define   设计   

原文地址:http://www.cnblogs.com/zufezzt/p/8099028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!