// uva 11538 Chess Queen // // 题目大意: // // 在 n * m 的棋盘中,放两个皇后,一个黑的,一个白的 // 求能让两个皇后相互攻击的放法,有多少种 // // 解题思路: // // 皇后攻击的方式只有在同一行,同一列,或者同一对角线 // 上,分类讨论: // // 1): 同一行,则白的放法有 n * m 种,黑的放法有m-1种 // // 2): 同一列,则白的方法有 m * n 种,黑的放法有n-1种 // // 3): 同一对角线,则第一个皇后的方法沿对角线依次为 // 1,2,3....n-1,n,....,n,n-1,...,3,2,1,因为对角线 // 一共m+n-1条,两边各有n-1,则放n的有m-n+1种,则 // 对角线上方法为 // sigma(i * (i-1)){ 1<=i<=n-1} * 2+ (m-n+1)*n*(n-1) // 因为有两条对角线,主对角线和副对角线.这里应该再*2 // 再用unsigned long long 就over啦~~~~ // // 感悟: // // 算法竞赛训练指南上的题目,实在是太美妙啦~~~继续加油~~~ // FIGHTING #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef unsigned long long ull; int main(){ ull n,m; //freopen("1.txt","r",stdin); while(cin >> n >> m){ if (!n && !m) break; if (n > m) swap(n,m); ull x; x = n * (n - 1) * (2 * n - 1) / 6; x = x - n * (n - 1) / 2; x = x * 2; x = x + (m - n + 1) * n * (n - 1); x = x * 2; x = x + m * n * (m + n - 2); cout << x << endl; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/timelimite/article/details/47295691