题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2533

题意:在n*m的棋盘上放两个(黑和白)相互攻击的皇后,求有多少种方法?  0<=(n,m)<=10e6;

下图是2*2的方案数12;

很明显要按行列还有对角三种来考虑,每种的方案数相加即可;

每一行我们要从m个格子中选择2个进行放所以方案数是m*(m-1),共有n行,所以有 n*m*(m-1) 种;同样可知每一列有n个格子,所以相对应的方案数有m*n*(n-1);

对角有两种我们可以讨论其中一种为,然后乘2即可;

当n<=m时 所有的/向的对角线,从左到右的长度依次为1,2,3,4,...n-1,n,n,...n,n,n-1,n-2,...2,1;(一共有m-n+1个n);

所以对角的情况 = 2*(2*∑(i*(i-1))(i=1 -> i=n-1)+(m-n+1)*n*(n-1));

∑(i*(i-1)) = ∑i2 - ∑i = n*(n-1)*(2*n-1)/6 - n*(n-1)/2 = n*(n-1)*(2*n-4)/3; 即所有的对角情况 = 2n(n-1)(3*m-n-1)/3

 ans = n*m*(m-1)  +  m*n*(n-1)  +  2n(n-1)(3*m-n-1)/3;

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
using namespace std;
typedef long long LL;
#define met(a, b) memset(a, b, sizeof(a))
const int N = ;
const double eps = 1e-;
const int INF = 0x3f3f3f3f;
const int mod = ; int main()
{
LL n, m, ans;
while(scanf("%lld %lld", &n, &m), m+n)
{
if(n > m) swap(m, n);
ans = n*m*(m-) + n*m*(n-) + *n*(n-)*(*m-n-)/;
printf("%lld\n", ans);
}
return ;
}

最新文章

  1. jquery兼容实验
  2. Json转Java Bean
  3. 基于TCP和多线程实现无线鼠标键盘-InputMethodManager
  4. 多线程基础(二)pthread的了解
  5. mybatis动态sql中where标签的使用
  6. Jmeter使用
  7. JAVA 下拉列表和滚动条
  8. bootstrap学习记录(慕课网教程)
  9. Centos系统mysql 忘记root用户的密码
  10. Redis环境搭建(Linux)
  11. uva 714 - Copying Books(贪心 最大值最小化 二分)
  12. Windows漏洞利用与防护(2015.8)
  13. java 文件的基本操作
  14. JSP(介绍,语法,指令)
  15. yum源搭建
  16. 【转】Raft 为什么是更易理解的分布式一致性算法
  17. Grafana展示報表數據的配置(二)
  18. Tomcat端口被占用解决办法
  19. Java中的Future相关
  20. 中国标准时间改为formatTime格式

热门文章

  1. BZOJ2874 : 训练士兵
  2. 使用WebRequest 检测 手机号归属地。 C#通用 使用json 和可设定超时的WebClient
  3. mysql的jdbc入门学习小结
  4. Mysql_mysql force Index 强制索引
  5. shell 之for [转]
  6. 使用ProxychainsMac下安装及配置
  7. 将正确的 HTTP 头转发给后端服务器的一些问题
  8. Leetcode | substr()
  9. 如何使用 Migration创建一个迁移
  10. ibatis动态sql配置启动时提示:The content of elements must consist of well-formed character data...