敢说就敢做

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

beap总是自诩敢说又敢做,又到了情人节,为了体现自己的勇气可嘉,beap决定给自己喜欢的女生买玫瑰花,以此表达自己的爱意。到花店里,他发现一共有K种花,同时他从网上得知,送N朵花的花语是LOVE,所以他决定在所有的花里面选N朵出来送给心爱的女生,但是又为了显示自己买了那么多种花,他决定这K种花一定要都出现在这N朵里面。现在beap将这些花排成一排,他想知道满足条件的N朵花,能摆成多少种形态呢?

Input

多组测试数据

每组测试数据包含两个整数N,K(0<N≤1000, 0<K≤30),N代表花的朵数,K代表花的种类数。

Output

对于每个N,K,输出答案mod 123456781。

Sample input and output

Sample Input Sample Output
  1. 1 1
  2. 2 2
  1. 1
  2. 2

Source

2012 UESTC ACM-ICPC Summer Training Team Selection 4
 
解题报告:
这是一道组合数学题目.
我么首先容易想到的是这样的思路: A(N,K) * k ^ ( n- k ) ,即,先给K朵花安置好,然后剩下的位置,每个都有K种选择,即K^( n - k ) 
但是这样是错误的,因为有重复的情况(仔细想想).
既然这条路走不通,我们只能尝试从一朵一朵花上递推进行入手了
令 DP ( i , j ) 表示还有 i 个位置,已经放置好了第 1 种 到第 j 种花的方案数
(想一想为什么是还有 i 个位置,而不是已经放好了第 1 个到 i 个位置呢)
转移:
k start from 1 to i - j + 1 (include)
 DP(i,j) += DP(i-k,j-1) * C(i,k)
我们考虑这个方程,因为每朵花至少要有一个,我们K自然而然的从 1 开始,那么为什么结束条件是 i - j +1 呢,因为还有j-1种花,每种至少要一朵,我们要给他们预留位置,之后乘上C( i ,k)就很好理解了,选位置,同时同种花之间没有区别
边界条件:
 if (j == 0 )
 {
     if (i == 0 ) return 1;
    else return 0;
 }
显然必须要把位置放满才能是合法的
 
这样,就解决了本题
 
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. #include <stack>
  8. #include <map>
  9. #include <set>
  10. #include <queue>
  11. #include <iomanip>
  12. #include <string>
  13. #include <ctime>
  14. typedef unsigned char byte;
  15. #define pb push_back
  16. #define input_fast std::ios::sync_with_stdio(false);std::cin.tie(0)
  17. #define local freopen("in.txt","r",stdin)
  18.  
  19. using namespace std;
  20. const int maxn = 1e3 + 50;
  21. const long long mod = 123456781;
  22. long long kp[maxn][maxn];
  23. long long dp[maxn][35];
  24.  
  25. long long counter(int x,int y)
  26. {
  27. if (kp[x][y] != -1)
  28. return kp[x][y];
  29. long long & ans = kp[x][y];
  30. if (x == y || y == 0) return ans = 1;
  31. return ans = (counter(x-1,y-1) + counter(x-1,y) ) % mod;
  32. }
  33.  
  34. long long dfs(int x,int y)
  35. {
  36. if (dp[x][y] != -1)
  37. return dp[x][y];
  38. long long & ans = dp[x][y] = 0;
  39. if (y == 0) return (ans = (x==0));
  40. for(int i = 1 ; i <= x - y + 1 ; ++ i)
  41. {
  42. ans += counter(x,i) * dfs(x - i , y - 1);
  43. if (ans >= mod)
  44. ans %= mod;
  45. }
  46. return ans;
  47. }
  48.  
  49. int main(int argc,char *argv[])
  50. {
  51. int n , k ;
  52. memset(dp , -1 , sizeof(dp));
  53. memset(kp , -1 , sizeof(kp));
  54. while(~scanf("%d%d",&n,&k))
  55. {
  56. if (n < k) printf("0\n");
  57. else
  58. printf("%lld\n",dfs(n,k));
  59. }
  60. return 0;
  61. }

UESTC_敢说就敢做 CDOJ 631的更多相关文章

  1. CDOJ 631 敢说敢做 记忆化搜索and动规

    //跟沈爷学的 传送门http://www.cnblogs.com/Xiper/p/4639636.html #include<cstdio> #include<iostream&g ...

  2. UESTC_方老师的分身 II CDOJ 915

    方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  3. UESTC_我要长高 CDOJ 594

    韩父有N个儿子,分别是韩一,韩二…韩N.由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万.舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火 ...

  4. UESTC_方老师分身 I CDOJ 914

    方老师分身 I Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  5. UESTC_握手 CDOJ 913

    握手 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status ...

  6. UESTC_神秘绑架案 CDOJ 881

    神秘绑架案 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  7. UESTC_方老师买表 CDOJ 885

    老师买表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Stat ...

  8. UESTC_冬马党 CDOJ 882

    冬马党 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Statu ...

  9. UESTC_魔法少女小蟹 CDOJ 710

    小蟹是一名魔法少女,能熟练的施放很多魔法. 有一天魔法学院上课的时候出现了这样一道题,给一个6位数,让大家用自己的魔法,把这个6位数变成另一个给定的6位数. 小蟹翻了下魔法书,发现她有以下6种魔法: ...

随机推荐

  1. bzoj3038 上帝造题的七分钟2

    Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是便有了对 ...

  2. eucimage

  3. 在 Java 应用程序中使用 Elasticsearch

    如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...

  4. java_内存划分

    内存划分

  5. poj 2010 Moo University - Financial Aid(优先队列(最小堆)+ 贪心 + 枚举)

    Description Bessie noted that although humans have many universities they can attend, cows have none ...

  6. EasyInvoice 使用教程 - (1) 认识 EI

    原视频下载地址:EI 主界面介绍 1. 主界面截图 2. 基础资料界面截图 3. 管理员 界面截图

  7. ASP.NET网页抓取数据

    我的数据通过一个TextBox输入,这些代码是写在一个button的点击事件里的. 网页数据抓取大概分为两步,第一步是获取网页源代码: 具体注释如下: var currentUrl = TextBox ...

  8. android控制之 adb shell (已完成,不定期增加内容)

    第一步:首先,下载adb1.0.32.zip,里面有如下图的内容: 第二步:解压缩,复制Adb.exe,和fastboot.exe到System32,注意AdbWinUsbApi.dll,AdbWin ...

  9. FileUpload

    一upload原理: 1.表单的method必须是post方法 2.enctype属性必须是“mutipatr/form-data”类型 enctype默认的属性是“application/x-www ...

  10. sqlite编译

    1.下载代码:http://www.sqlite.org/download.html ,windows下下载sqlite-amalgamation-xxx.zip和sqlite-dll-win32-x ...