首先按横纵坐标之和的奇偶性对棋盘染色,
可以发现染色不同的方格之间是不会互相影响的。


把棋盘旋转 45 45°,就会得到一个菱形方格图,
只考虑白色方格上的棋子,原本是沿对角线移动,
但此时它们沿水平方向和竖直方向移动。


注意到菱形方格图中每行的方格数不全相同,
所以按方格数从小到大的先后顺序处理行,以避免后效性。

fi,j f_{i,j} 表示前 i i 行,用 jj 个棋子的方案数,
有 fi,j=fi−1,j+fi−1,j−1∗(cnti−j+1) | cnti>=j f_{i,j} = f_{i-1,j} + f_{i-1,j-1}*(cnt_i-j+1)\ | \ cnt_i >= j

复杂度: O(n∗k) O(n*k)


#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>const int sz = 11;int n, k, c[2];
long long f[2][sz][sz*sz];
long long ans;
int lcnt[sz<<1];int linecnt(int t)
{return (t<=n)?t:((n<<1)-t);
}void solve(int x)
{f[x][0][0] = 1;for(int i = 1; ((i<<1)-x) <= (n<<1); c[x] = i++)lcnt[i] = linecnt((i<<1)-x);std::sort(lcnt + 1, lcnt + c[x] + 1);   for(int i = 1; i <= c[x]; i++)for(int j = 0; j <= k && j <= lcnt[i]; j++)f[x][i][j] = f[x][i-1][j] + f[x][i-1][j-1]*(lcnt[i]-j+1);   }
void getans()
{for(int i = 0; i <= k; i++)ans += f[0][c[0]][i]*f[1][c[1]][k-i];
}int main()
{
#ifndef ONLINE_JUDGE    freopen("sgu220.in","r",stdin);freopen("sgu220.out","w",stdout);
#endifstd::cin >> n >> k;solve(0), solve(1), getans();std::cout << ans;#ifndef ONLINE_JUDGEfclose(stdin);fclose(stdout);
#endifreturn 0;
}

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>const int sz = 51, Base = 10000;struct BigNum
{int num[sz], l;
}emp;int n, k;
BigNum f[2][sz][sz*sz];
BigNum ans;int c[2], lcnt[sz<<1];void digit(int &plus,int &tp)
{plus += tp/Base, tp %= Base;
}
BigNum operator *(const BigNum &a,const int &b)
{BigNum ret = a;if(!a.l || !b){ret.l = 0; return ret;}for(int i = 1; i <= ret.l; i++) ret.num[i] = a.num[i] * b;for(int i = 1; i <= ret.l; i++) digit(ret.num[i+1] ,ret.num[i]);while(ret.num[ret.l+1]) ++ret.l, digit(ret.num[ret.l+1], ret.num[ret.l]);   return ret;
}
BigNum operator +(const BigNum &a,const BigNum &b)
{BigNum ret = emp;   ret.l = std::max(a.l,b.l);for(int i = 1; i <= ret.l; i++) ret.num[i] = a.num[i] + b.num[i];for(int i = 1; i <= ret.l; i++) digit(ret.num[i+1] ,ret.num[i]);if(ret.num[ret.l+1]) ret.l++;   return ret;
}
BigNum operator *(const BigNum &a,const BigNum &b)
{BigNum ret = emp;   if(!a.l || !b.l){ret.l = 0; return ret;}ret.l = a.l + b.l - 1;      for(int i = 1; i <= a.l; i++)for(int j = 1; j <= b.l; j++){ret.num[i+j-1] += a.num[i]*b.num[j];digit(ret.num[i+1], ret.num[i]);}for(int i = 1; i <= ret.l; i++) digit(ret.num[i+1] ,ret.num[i]);while(ret.num[ret.l+1]) ++ret.l, digit(ret.num[ret.l+1], ret.num[ret.l]);   return ret;
}
void prt(const BigNum &a)
{printf("%d",a.num[a.l]);for(int i = a.l-1; i >= 1; i--)printf("%04d",a.num[i]);
}int linecnt(int t)
{return (t<=n)?t:((n<<1)-t);
}
void solve(int x)
{f[x][0][0].l = f[x][0][0].num[1] = 1;for(int i = 1; ((i<<1)-x) <= (n<<1); c[x] = i++)lcnt[i] = linecnt((i<<1)-x);std::sort(lcnt + 1, lcnt + c[x] + 1);   for(int i = 1; i <= c[x]; i++)for(int j = 0; j <= k && j <= lcnt[i]; j++)f[x][i][j] = f[x][i-1][j] + (f[x][i-1][j-1]*(lcnt[i]-j+1)); }
void getans()
{for(int i = 0; i <= k; i++)ans = ans + (f[0][c[0]][i]*f[1][c[1]][k-i]);
}int main()
{
#ifndef ONLINE_JUDGE    freopen("sgu221.in","r",stdin);freopen("sgu221.out","w",stdout);
#endifstd::cin >> n >> k;solve(0), solve(1), getans();prt(ans);#ifndef ONLINE_JUDGEfclose(stdin);fclose(stdout);
#endifreturn 0;
}

sgu220sgu221相关推荐

最新文章

  1. SLAM从0到1——ORB特征提取及特征匹配
  2. 怎么合成音乐_剪映教程:剪映怎么剪辑音乐?
  3. qt opencv cmake配置 单纯小白
  4. 白话详细解读(六)----- BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation
  5. 启明智显分享| 2.4寸旋钮串口屏在健身器材上的应用
  6. vue的列表交错过渡
  7. 在OUTLOOK或OWA中查看邮件的SCL级别(转)
  8. Mock.js 和Node.js详细讲解
  9. 计算机室内设计cad实践报告,cad实习报告3000字
  10. Robots.txt 协议——百度之星
  11. Android 系统性能优化(53)---功耗优化battery-historian V2.0的数据获取
  12. 被尘封的故事技能点bug_王者荣耀体验服更新,多名英雄技能优化,瑶妹玩家却坐不住了...
  13. 计算机网络技术应用和发展,计算机网络技术的应用和发展研究
  14. 在线文字图标logo文章封面图生成工具
  15. printf,sprintf,vsprintf 区别【转】
  16. SVN共享链接时,避免使用服务器地址,要使用根目录(^)
  17. Java接口和抽象类区别
  18. 荐书 | 心理学如何编程,看看这9本书
  19. 横图图片广告代码html,jQuery网页底部固定横幅图片广告代码
  20. IE浏览器怎么查看cookie

热门文章

  1. vscode在终端无法输入/输出
  2. Python-Scapy安装方法(参考官方教程)
  3. html css 优酷客户端视频界面仿写 rem swiper flex使用
  4. 连续加班易“脑残”,程序员做做白日梦未尝不是一件好事!
  5. wzz24_0603
  6. 「整理文件轻松有妙招!教你如何按类型将文件夹里的文件进行归类保存」
  7. Fortran之open,write,read,inquire,Namelist 使用
  8. STM32F103系列USB的学习过程及使用心得(一)(概括篇)
  9. 浅出Freebsd的Fontconfig
  10. 【pandas】testdata数据集分析