hdu2189

/*
v[] //表示150内的素数 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int c1[150], c2[150]; 
int v[40] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,  
79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 1555}; 
void init() {
        memset(c1, 0, sizeof(c1));
        memset(c2, 0, sizeof(c2));
        for (int i = 0; i <= 150; i+=2) //+=2 因为2为第一个素数 为 第一个小组
          c1[i] = 1;
        for (int i = 2; i <= 35; i++) {
            for (int j = 0; j<= 150; j++) {
                for (int k = 0; j+k <= 150; k += v[i]) {//几个v[i]小组 
                    c2[j+k] += c1[j]; 
                }
            }
            for (int j = 0; j <= 150; j++) {
                c1[j] = c2[j];
                c2[j] = 0;
            }
        } 
}
int main() {
  int t;
  init();
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        printf("%d\n", c1[n]);
    } 
}

 

posted @ 2017-11-11 14:24  白丁一枚  阅读(93)  评论(0编辑  收藏  举报