STL——Number
题目描述
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]
示例
输入
28
输出
1
说明
There is only one Shuaishuai number.
方法一:
仅使用vector
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<cmath>
using namespace std;
vector<long long int> a;
vector<long long int> b;
long long int n;
bool isprime(int m)
{
for(int i=2;i<=sqrt(m);i++){
if(m%i==0){
return false;
}
}
return true;
}
int main()
{
cin>>n;
for(long long int i=2;i<7073;i++){
if(isprime(i)){
a.push_back(i);
}
}
int len=a.size();
for(int i=0;i<len;i++){
long long c=pow(a[i],2);
if(c>=n){
break;
}
for(int j=0;j<len;j++){
long long d=pow(a[j],3);
if(d>=n){
break;
}
for(int t=0;t<len;t++){
long long e=pow(a[t],4);
if(e>=n){
break;
}
long long int s=c+d+e;
if(s>n){
break;
}
b.push_back(s);
}
}
}
sort(b.begin(),b.end());
int cnt=unique(b.begin(),b.end())-b.begin();
printf("%d\n",cnt);
return 0;
}
方法二:
使用vector和set
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<cmath>
using namespace std;
vector<long long int> a;
set<long long int> b;
long long int n;
bool isprime(int m)
{
for(int i=2;i<=sqrt(m);i++){
if(m%i==0){
return false;
}
}
return true;
}
int main()
{
cin>>n;
for(long long int i=2;i<7073;i++){
if(isprime(i)){
a.push_back(i);
}
}
int len=a.size();
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
for(int t=0;t<len;t++){
long long int s=pow(a[i],2)+pow(a[j],3)+pow(a[t],4);
if(s>n){
break;
}
b.insert(s);
}
}
}
printf("%d\n",b.size());
return 0;
}
注意:
使用vector要用unique去重
使用set不需要去重