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

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL mod=1e9+;
LL MOD(LL x){return (x%mod+mod)%mod;} LL jc[],inv[];
LL quick_pow(LL A,LL p)
{
LL ret=;
while(p!=)
{
if(p%==)ret=(ret*A)%mod;
A=(A*A)%mod;p/=;
}
return ret;
}
LL getC(int n,int m){return jc[m]*inv[m-n]%mod*inv[n]%mod;} struct node{int x,y;}a[];
bool cmp(node n1,node n2){return n1.x+n1.y>n2.x+n2.y;}
LL f[];
int main()
{
jc[]=,inv[]=;for(int i=;i<=;i++)jc[i]=(jc[i-]*i)%mod,inv[i]=quick_pow(jc[i],mod-);
int n,m,K;
scanf("%d%d%d",&n,&m,&K);
for(int i=;i<=K;i++)
scanf("%d%d",&a[i].x,&a[i].y);
a[++K].x=,a[K].y=;
sort(a+,a+K+,cmp); for(int i=;i<=K;i++)
{
f[i]=getC(n-a[i].x,(n+m)-(a[i].x+a[i].y));
for(int j=;j<i;j++)
if(a[i].x<=a[j].x&&a[i].y<=a[j].y)
{
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))) );
}
}
printf("%I64d\n",f[K]);
return ;
}

cf 559C

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

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

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL f[][][]; void initf()
{
f[][][]=f[][][]=;
for(int i=;i<=;i++)
for(int j=;j<=i;j++)
{
for(int k=j;k<=i-;k++)f[i][j][]+=f[i-][k][];
for(int k=;k<=j-;k++)f[i][j][]+=f[i-][k][];
}
} bool v[];
int main()
{
initf(); int T;
scanf("%d",&T);
while(T--)
{
int n;LL m;
scanf("%d%lld",&n,&m);
memset(v,false,sizeof(v));
int x,k;
for(int j=;j<=n;j++)
{
if(f[n][j][]>=m){x=j,k=;break;}
else m-=f[n][j][]; if(f[n][j][]>=m){x=j,k=;break;}
else m-=f[n][j][];
}
v[x]=true;printf("%d",x);
for(int i=;i<=n;i++)
{
k^=; int j=;
for(int y=;y<=n;y++)
{
if(v[y]==true)continue;
j++; if((k==&&y<x)||(k==&&y>x))
{
if(f[n-i+][j][k]>=m){x=y;break;}
else m-=f[n-i+][j][k];
}
}
v[x]=true;printf(" %d",x);
}
printf("\n");
}
return ;
}

poj1037

最新文章

  1. PHP的输出缓冲区(转)
  2. tomcat监控脚本
  3. 高效SQL语句(SQL Server)
  4. 【高可用HA】Apache (1) —— Mac下安装Apache Httpd到自定义路径(非/etc/apache2)
  5. Java学习--String、StringBuffer与StringBuilder
  6. 浏览器缓存相关http头
  7. html系列教程--DOCTYPE a area
  8. Java学习之equals和==的区别
  9. 基于visual Studio2013解决算法导论之025双向循环链表
  10. 《Javascript权威指南》学习笔记之十二:数组、多维数组和符合数组(哈希映射)
  11. java JDK源码解析
  12. 从头开始学Maven【仓库】
  13. ospf的虚连接配置
  14. 关于Android的fragment的使用
  15. postgresql 最大连接数相关
  16. PMP证书的获取,不知道10大注意事项会吃亏
  17. SpringBoot初识
  18. codeforces 750D New Year and Fireworks【DFS】
  19. (zhuan) How to Train Neural Networks With Backpropagation
  20. nginx是什么,如何使用

热门文章

  1. knockout Ajax异步无刷新分页 Demo +mvc+bootstrap
  2. iOS QQ的AppID转换16进制的方法
  3. &lt;转载&gt; Jquery的使用技巧-实用!
  4. jmeter通过json extrcator或者正则表达式获取json返回信息
  5. FZU2030(括号匹配)
  6. EF 批量更新删除(linq篇)
  7. java读取本地文件
  8. 【python】-- Django 分页 、cookie、Session、CSRF
  9. MySql 批处理
  10. 给俺的 CSDN 博客加背景音乐 - 高大尚的《心经》背景音乐