刷题记录:牛客NC14615Number

传送门:牛客

We define Shuaishuai-Number as a number which is the sum of a prime square(平方), 
prime cube(立方), and prime fourth power(四次方).
How many Shuaishuai numbers in [1,n]? (1<=n<=50 000 000)

主要思路:
首先需要明白的是这道题并不难,直接暴力3层枚举也可过,但是它在内存方面
卡了一下
刚开始我直接拿vis[50000002]来记录数字,但是众所周知虽然本地编译不会报错,但是因为 int 4字节 对于128MB限制 相当于可以存放int数组大小最大为33554432,所以显然爆内存了

解决方法

  1. 方法一:可以用set来直接存放数字,因为set的不可重复性,最后输出set的大小即可
  2. 方法二:开一个数组存数字,然后排序,然后使用unique函数进行去重(该函数去重前需要排序)
unique函数使用方法
unique(a,a+n)-a//从0开始的数组
或
unique(a+1,a+n+1)-a-1;//从1开始的数组
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	ll x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
#define maxn 1000000
ll n;
ll num[8002];
//void init() {
//	for(int i=2;i<=n/2;i++) {
//		for(int j=i*2;j<=n;j+=i) {
//			vis[j]=1;
//		}
//	}
//}
int nn=0;
void init() {
	for(int i=2;i<=8000;i++) {
		int flag=0;
		for(int j=2;j<=sqrt(i);j++) {
			if(i%j==0) {
				flag=1;
				break;
			}
		}
		if(flag==0) {
			num[++nn]=i;
		}
	}
}
set<int> sum;
int main() {
	n=read();
	init();
//	for(int i=1;i<=nn;i++) cout<
	for(int i=1;i<=nn;i++) {
		if(num[i]*num[i]*num[i]*num[i]>n) break;
		for(int j=1;j<=nn;j++) {
			if(num[i]*num[i]*num[i]*num[i]+num[j]*num[j]*num[j]>n) break;
			for(int k=1;k<=nn;k++) {
				if(1ll*num[i]*num[i]*num[i]*num[i]+num[j]*num[j]*num[j]+num[k]*num[k]>n) break;
				else {
					sum.insert(1ll*num[i]*num[i]*num[i]*num[i]+num[j]*num[j]*num[j]+num[k]*num[k]);
				}
			}
		}
	}
	cout<<sum.size()<<endl;
	return 0;
}

你可能感兴趣的:(c++算法,算法,c++)