HDU 2512 一卡通大冒險

一卡通大冒險

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1388    Accepted Submission(s): 915


Problem Description
因爲長期鑽研算法, 無暇顧及個人問題,BUAA ACM/ICPC 訓練小組的帥哥們大部分都是單身。某天,他們在機房商量一個絕妙的計劃"一卡通大冒險"。這個計劃是由wf最先提出來的,計劃的內容是,把自己的聯繫方式寫在校園一卡通的背面,然後故意將自己的卡"遺失"在某處(如水房,TD,食堂,主M。。。。)他們希望能有MM看到他們遺失卡,能主動跟他們聯繫,這樣就有機會請MM吃飯了。他們決定將自己的一卡通夾在基本相同的書裏,然後再將書遺失到校園的各個角落。正當大家爲這個絕妙的計劃叫好時,大家想到一個問題。很明顯,如果只有一張一卡通,那麼只有一種方法,即,將其夾入一本書中。當有兩張一卡通時,就有了兩種選擇,即,將兩張一卡通夾在一本書裏,或者分開夾在不同的書裏。當有三張一卡通時,他們就有了5種選擇,即:
{{A},{B},{C}} , {{A,B},{C}}, {{B,C},{A}}, {{A,C},{B}} ,{{A,B,C}} 於是,
這個邪惡計劃的組織者wf希望瞭解,如果ACM訓練對裏有n位帥哥(即有N張一卡通),那麼要把這些一卡通夾到書裏有多少種不同的方法。
 

Input
包含多組數據,第一行爲n,表示接下來有n組數據。以下每行一個數x,表示共有x張一卡通。(1≤x≤2000).
 

Output
對每組數據,輸出一行:不同的方法數,因爲這個數可能非常大,我們只需要它除以1000的餘數。
 

Sample Input
4 1 2 3 100
 

Sample Output
1 2 5 751
 

Author
BUAA Campus 2007
 

Source
解題思路:求n個數劃分爲k個集合,集合內無序的分法的種數,就是第二類stirling數
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[2005][2005],ans[2005];
void ini()
{
    int i,j,sum;
    memset(dp,0,sizeof(dp));
    memset(ans,0,sizeof(ans));
    for(i=1;i<=2000;i++)
        dp[i][1]=dp[i][i]=1;
    ans[1]=1;
    for(i=2;i<=2000;i++)
    {
        sum=0;
        for(j=2;j<i;j++)
        {
            dp[i][j]=(dp[i-1][j-1]+dp[i-1][j]*j)%1000;
            sum+=dp[i][j];
        }
        ans[i]=sum%1000;
        ans[i]+=2;
    }
}
int main()
{
    int t,n;
    scanf("%d",&t);
    ini();
    while(t--)
    {
        scanf("%d",&n);
        printf("%d\n",ans[n]);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章