您的位置:首页 > 其它

uva11538(数论)

2015-03-26 18:15 113 查看
题意:

给一个n*m的棋盘,放两个互相攻击的皇后,有几种方法;

思路:

同一行攻击,和同一列攻击都很好算;

就是对角线有点麻烦

对角线:2*(2*(A(2,2)+A(3,2)+A(4,2)+…+A(m-1,2))+A(m,2)*(n-m+1))

n小于m时交换,这样就避免分类

因为两条对角线对称,所以直接乘以2

对角线上面的个数:2,3,4,…m-1,m…m,m-1,…4,3,2.

其中m的个数为n-m+1个
AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;

int main() {
ll n, m;
while(scanf("%lld%lld",&n,&m) && n) {
if(n > m)
swap(n,m);
ll tmp = n * m *(n + m - 2) + 2 * n * (n - 1) * (3 * m -n -1) / 3;
printf("%lld\n",tmp);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: