問題 L(1330): Prime
時間限制: 1 Sec 內存限制: 64 MB
題目描述
輸入
輸出
樣例輸入
2
樣例輸出
1
提示
【數據規模】
對於40%的數據 N<=200
對於100%的數據 N<=2000
這是一個套完全揹包模板的題。。
先篩出2000內所有素數
作爲元素來塞揹包
看最後有多少塞法
答案會爆unsigned long long
於是使用高精度。
代碼:
#include<cstdio>
#include<cstring>
#define PRIMEL 2200
#define ULL unsigned long long
bool vis[PRIMEL];
int prime[PRIMEL],tot=1;
inline int max(int a,int b){return a>b?a:b;}
void phi(){
int tmp=(PRIMEL+1)/2;
for(int i=2;i<=tmp;i++)
if(!vis[i])for(int j=i+i;j<PRIMEL;j+=i)vis[j]=true;
for(int i=2;i<PRIMEL;i++)
if(!vis[i])prime[tot++]=i;
}
struct Num{
char s[100];
int len;
Num(){len=0;memset(s,0,sizeof s);}
Num(const Num&a){
memcpy(s,a.s,sizeof s);
len=a.len;
}
void print(){
for(int i=len-1;i>=0;i--)
putchar(s[i]+'0');
}
};
Num operator+(Num a,Num b){
Num ret;
int len=max(b.len,a.len);
for(int i=0;i<len;i++){
ret.s[i]+=a.s[i]+b.s[i];
ret.s[i+1]=ret.s[i]/10;
ret.s[i]%=10;
}
if(ret.s[len])len++;
ret.len=len;
return ret;
}
int n;
Num f[2200];
int main(){
f[0].len=1;
f[0].s[0]=1;
phi();
scanf("%d",&n);
for(int i=1;i<tot&&prime[i]<=n;i++)
for(int j=prime[i];j<=n;j++)
f[j]=f[j-prime[i]]+f[j];
f[n].print();
}