Hdu 2189
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=2189
?
題意不難,就是將一個數拆分成若干個素數的和(數字可以有重復),問能幾種拆分的方法。
第一眼看到一不小心就認為是Dfs,結果自然是超時。
后來仔細想了一下,題目之要求求出有幾種,沒有什么其他要求。而Dfs更適用與要求求出具體哪些素數相加得的題更合適。題目也說了,假設人與人之間是沒區別的,因此我想到了生成函數。使用生成函數,這題看上去就簡單許多了。
?
#include <iostream> #include <cmath> #include <cstring> #include <cstdio>using namespace std; const int MAXN = 150 + 5; int c1[MAXN], c2[MAXN];bool Is_prime( int n ) {int k = sqrt( n );int i;for( i=2;i<=k;i++ ){if( n%i==0 ){return false;}}return true; }int main() {int i,j,k;memset( c1,0,sizeof(c1) );for( i=0;i<MAXN;i+=2 ){c1[i] = 1;}memset( c2, 0, sizeof(c2) );for( i=3;i<MAXN;i++ ){if( Is_prime(i)==false )continue;for( j=0;j<MAXN;j++ ){for( k=0;k+j<MAXN;k+=i ){c2[ k+j ] += c1[ j ];}}for( j=0;j<MAXN;j++ ){c1[j] = c2[j];c2[j] = 0;}}int N;int T;cin >> T;while( T-- ){cin >> N;cout << c1[N] << endl;}return 0; }?
轉載于:https://www.cnblogs.com/Emerald/p/4108010.html
總結
- 上一篇: Linux下的USB总线驱动(04)——
- 下一篇: 转:UniqueID和ClientID的