UVa 10943 How do you add?
阿新 • • 發佈:2018-12-22
題意:求將數字n分為k個數之和的種類數。高中排列組合的題目,隔板法!
題解:為啥要寫這個題解,因為WA了很多次。可以把一個數字n,看成是n個球,然後用k個隔板把他分開就行。
所以C[n+1][k-1],然後就WA了
#include <iostream>//錯誤程式碼 #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> using namespace std; #define io ios::sync_with_stdio(0),cin.tie(0) #define ms(arr) memset(arr,0,sizeof(arr)) #define inf 0x3f3f3f typedef long long ll; const int mod=1e6; int c[220][220]; void init() { c[0][0]=1; for(int i=0;i<=110;i++) { c[i][0]=1; c[i][i]=1; } for(int i=2;i<=110;i++) for(int j=1;j<i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1]+mod)%mod; } int main() { int n,k; init(); while(cin>>n>>k) { if(n==0&&k==0) break; cout<<(c[n+1][k-1]+mod)%mod<<endl; } return 0; }
因為沒有考慮0+0+....+n的這幾種情況,也就是說每個隔板之間不一定一定要有小球。所以公式為:C[n+k-1][k-1];
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> using namespace std; #define io ios::sync_with_stdio(0),cin.tie(0) #define ms(arr) memset(arr,0,sizeof(arr)) #define inf 0x3f3f3f typedef long long ll; const ll mod=1e6; int c[300][300]; void init() { c[0][0]=1; for(int i=0;i<300;i++) { c[i][0]=1; // c[i][i]=1; } for(int i=1;i<300;i++) for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1]+mod)%mod; } int main() { int n,k; init(); while(~scanf("%d%d",&n,&k)) { if(n==0&&k==0) break; printf("%d\n",(c[n+k-1][k-1]+mod)%mod); } return 0; }