拿到這個題找規律找了好久...畫了半天才發現規律...結果網上一搜..就是C(M,N)的求取啊..坑啊..
先說簡單的思路..循環的遞增其實就是從一個長度爲n的遞增序列,然後每個數都不一樣,從中找出m個數..所以直接就是C(M,N)...
而且用C(M,N)公式計算的話還是複雜了.可以直接用C(M,N)=C(M,N-1)+C(M-1,N-1)來算出一張表來..每次輸入直接在表中查找即可..當然這是別人的思路..
我還是說下我找的規律吧..
一開始看半天,也寫不出公式..於是選擇按照<怎樣解題>的思路來..先自己從簡單的情況慢慢找...盡信書不如無書啊...
1.當m==1的時候,很顯然次數爲n
2.當m==2的時候,算出每次第一層循環變化時候第二層循環中執行的次數,可以看出是從n-1一直累加到1.
3.當m>=3的時候計算的情況就變了.就從一維的變爲多維的了.爲了方便說,就以m==3來說.每排都是由最下面兩層循環計算的,然後再多一層,那麼就會多一排出來.所以可以看做是二維的.同理,當m==4的時候,最下面三排構成一個二維的..然後最上面排構成第三個維度..這就是遞歸的神奇之處吧!下一個維度由多個上一維度組成.於是就可以看成是一個動態規劃的問題了..
貌似說的有些複雜..還是貼出別人思路的代碼吧..自己寫的..雖然差不多...
#include<stdio.h>
#include<string.h>
int map[2001][2001];
int main()
{
int i,j;
int n,m;
int fenzi,fenmu;
for(i=1;i<=2000;i++)
{
for(j=i;j<=2000;j++)
{
if(i==1)
{
map[i][j]=j%1009;
}
else if(i==j)
{
map[i][j]=1;
}
else
{
map[i][j]=map[i][j-1]+map[i-1][j-1];
map[i][j]%=1009;
}
}
}
while(scanf("%d %d",&m,&n))
{
if(m+n==0)
break;
printf("%d\n",map[m][n]);
}
}