cf 559C 考虑到黑色的格子很少,那么我把(1,1)变成黑色,然后按每个黑色格子接近终点的程度排序,计算黑色格子不经过另一个黑色格子到达终点的方案,对于当前的格子,要减去在它右下角的所有方案数(注意不是f值)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. typedef long long LL;
  9. const LL mod=1e9+;
  10. LL MOD(LL x){return (x%mod+mod)%mod;}
  11.  
  12. LL jc[],inv[];
  13. LL quick_pow(LL A,LL p)
  14. {
  15. LL ret=;
  16. while(p!=)
  17. {
  18. if(p%==)ret=(ret*A)%mod;
  19. A=(A*A)%mod;p/=;
  20. }
  21. return ret;
  22. }
  23. LL getC(int n,int m){return jc[m]*inv[m-n]%mod*inv[n]%mod;}
  24.  
  25. struct node{int x,y;}a[];
  26. bool cmp(node n1,node n2){return n1.x+n1.y>n2.x+n2.y;}
  27. LL f[];
  28. int main()
  29. {
  30. jc[]=,inv[]=;for(int i=;i<=;i++)jc[i]=(jc[i-]*i)%mod,inv[i]=quick_pow(jc[i],mod-);
  31. int n,m,K;
  32. scanf("%d%d%d",&n,&m,&K);
  33. for(int i=;i<=K;i++)
  34. scanf("%d%d",&a[i].x,&a[i].y);
  35. a[++K].x=,a[K].y=;
  36. sort(a+,a+K+,cmp);
  37.  
  38. for(int i=;i<=K;i++)
  39. {
  40. f[i]=getC(n-a[i].x,(n+m)-(a[i].x+a[i].y));
  41. for(int j=;j<i;j++)
  42. if(a[i].x<=a[j].x&&a[i].y<=a[j].y)
  43. {
  44. f[i]=MOD( f[i]-MOD(f[j]*getC(a[j].x-a[i].x,(a[j].x+a[j].y)-(a[i].x+a[i].y))) );
  45. }
  46. }
  47. printf("%I64d\n",f[K]);
  48. return ;
  49. }

cf 559C

poj1737 口胡一波题解,我们知道n个点的无向图个数有2^(n*(n-1)/2)个,那么就去算不联通的,假设存在有一个包括点1的块大小为k,剩下的就是n-k个点的无向图个数了。

poj1037 其实可以借鉴一下康托展开的思想的。。。对于当前位应该选取最大的那个剩下位方案数少于m的,那么方案数就要用DP维护了。设f[i][j][k]表示枚举到第几位,选的是当前排第j的,是高位还是低位。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. typedef long long LL;
  9. LL f[][][];
  10.  
  11. void initf()
  12. {
  13. f[][][]=f[][][]=;
  14. for(int i=;i<=;i++)
  15. for(int j=;j<=i;j++)
  16. {
  17. for(int k=j;k<=i-;k++)f[i][j][]+=f[i-][k][];
  18. for(int k=;k<=j-;k++)f[i][j][]+=f[i-][k][];
  19. }
  20. }
  21.  
  22. bool v[];
  23. int main()
  24. {
  25. initf();
  26.  
  27. int T;
  28. scanf("%d",&T);
  29. while(T--)
  30. {
  31. int n;LL m;
  32. scanf("%d%lld",&n,&m);
  33. memset(v,false,sizeof(v));
  34. int x,k;
  35. for(int j=;j<=n;j++)
  36. {
  37. if(f[n][j][]>=m){x=j,k=;break;}
  38. else m-=f[n][j][];
  39.  
  40. if(f[n][j][]>=m){x=j,k=;break;}
  41. else m-=f[n][j][];
  42. }
  43. v[x]=true;printf("%d",x);
  44. for(int i=;i<=n;i++)
  45. {
  46. k^=; int j=;
  47. for(int y=;y<=n;y++)
  48. {
  49. if(v[y]==true)continue;
  50. j++;
  51.  
  52. if((k==&&y<x)||(k==&&y>x))
  53. {
  54. if(f[n-i+][j][k]>=m){x=y;break;}
  55. else m-=f[n-i+][j][k];
  56. }
  57. }
  58. v[x]=true;printf(" %d",x);
  59. }
  60. printf("\n");
  61. }
  62. return ;
  63. }

poj1037

0x5C 计数类DP的更多相关文章

  1. 动态规划——区间DP,计数类DP,数位统计DP

    本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...

  2. SDOI2010代码拍卖会 (计数类DP)

    P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...

  3. CH5E26 扑克牌 (计数类DP)

    $ CH~5E26~\times ~ $ 扑克牌: (计数类DP) $ solution: $ 唉,计数类DP总是这么有套路,就是想不到. 这道题我们首先可以发现牌的花色没有价值,只需要知道每种牌有 ...

  4. $Poj1737\ Connected\ Graph$ 计数类$DP$

    AcWing Description 求$N$个节点的无向连通图有多少个,节点有标号,编号为$1~N$. $1<=N<=50$ Sol 在计数类$DP$中,通常要把一个问题划分成若干个子问 ...

  5. $CF559C\ Gerald\ and\ Fiant\ Chess$ 计数类$DP$

    AcWing Description 有个$H$行$W$列的棋盘,里面有$N$个黑色格子,求一个棋子由左上方格子走到右下方格子且不经过黑色格子的方案数. $1<=H,M<=1e5,1< ...

  6. $CH5302$ 金字塔 区间$DP$/计数类$DP$

    CH Sol f[l][r]表示l到r这段区间对应的金字塔结构种数 发现是f[l][r]是可以由比它小的区间推出来的 比如已知f[l+1][k],f[k+1][r],不难想到f[l][r]+=f[l+ ...

  7. hackerrank【Lego Blocks】:计数类dp

    题目大意: 修一个层数为n,长度为m的墙,每一层可以由长度为1.2.3.4的砖块构成. 每一层都在同一个长度处出现缝隙是方案非法的,问合法的方案数有多少种 思路: 先求出总方案,再减去所有非法的方案数 ...

  8. codeforces 277.5 div2 F:组合计数类dp

    题目大意: 求一个 n*n的 (0,1)矩阵,每行每列都只有两个1 的方案数 且该矩阵的前m行已知 分析: 这个题跟牡丹江区域赛的D题有些类似,都是有关矩阵的行列的覆盖问题 牡丹江D是求概率,这个题是 ...

  9. Codeforces 9D How many trees? 【计数类DP】

    Codeforces 9D How many trees? LINK 题目大意就是给你一个n和一个h 问你有多少个n个节点高度不小于h的二叉树 n和h的范围都很小 感觉有无限可能 考虑一下一个很显然的 ...

随机推荐

  1. Unity3D学习笔记——UIScrollBar和UIScrollView使用

    UIScrollBar和UIScrollView结合使用效果图如下: 一:使用步骤  1.创建一个UIScrollView   2.然后创建一个UIScrollBar 3.打开UIScrollView ...

  2. [ACM] hdu 3923 Invoker (Poyla计数,高速幂运算,扩展欧几里得或费马小定理)

    Invoker Problem Description On of Vance's favourite hero is Invoker, Kael. As many people knows Kael ...

  3. 【Python】Python获取命令行參数

    有时候须要用同一个Python程序在不同的时间来处理不同的文件,此时假设老是要到Python程序中去改动输入.输出文件名称.就太麻烦了. 而通过Python获取命令行參数就方便多了.以下是我写得一个小 ...

  4. Windows10环境vagrant+VirtualBox虚拟机无法创建私有网络的解决方案。

    报错信息 ==> default: Clearing any previously set network interfaces...There was an error while execu ...

  5. SteinerTree模板

    #define N 55//所有点的个数 #define K 10//SteinerTree 最大顶点数,必须精确 #define INF 10000000 //SteinerTree 邻接矩阵模板. ...

  6. 详解Amazon S3上传/下载数据

    AWS简单储存服务(Amazon S3)是非常坚牢的存储服务,拥有99.999999999%的耐久性(记住11个9的耐久性). 使用CloudBerry Explorer,从Amazon S3下载数据 ...

  7. offset,scroll,client系列

    offsetHeight: 元素高,height+border+paddingoffsetWidth: 元素宽,width+border+paddingoffsetTop: 距离offsetParen ...

  8. python基础知识回顾[1]

    1.声明变量 # 声明一个变量name用来存储一个字符串'apollo' name = 'apollo' # 声明一个变量age用来存储一个数字20 age = 20 # 在控制台打印变量name中存 ...

  9. 解决后台无法进入提示DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value

    最近小美眉的网站被盯上了,被添加了非常多的dubo页面,删除了5w多个文件,但还是不停的增加,因为网站权重还可以,很多都被收录了,结果可想而知,ytkah帮她迁移,在迁移网站时遇到了一些问题,后台登录 ...

  10. python ipython notebook或者 jupyter notebook 的安装

    IPython Notebook使用浏览器作为界面,向后台的IPython服务器发送请求,并显示结果.在浏览器的界面中使用单元(Cell)保存各种信息.Cell有多种类型,经常使用的有表示格式化文本的 ...