uva 11538 - Chess Queen(数论)

2014-11-24 12:52:54 · 作者: · 浏览: 2

题目链接:uva 11538 - Chess Queen

题目大意:在一个n m的棋盘上,放两个皇后,要求两个皇后可以互相攻击,求有多少种放法。

解题思路:因为皇后的攻击范围为竖线、横线和斜线,所以枚举每条上两个皇后放的位置,比如一条斜线有8个,那么放两个皇后的种数就有C(82)种。
行数n,每行m个位置C(m2) n
列数m,每列n个位置C(n2) m

斜线,2 (2 ∑i=1n 1i (i 1)+(m n+1) n (n 1)),因为正斜线和翻斜线,所以要乘以2
最后公式化简为2 n (n 1) (3 m n 1)3

代码:

#include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; typedef unsigned long long ll; ll n, m; int main () { while (cin >> n >> m) { if (!(n + m)) break; if (m < n) swap(n, m); cout << n * m * (n+m-2) + 2 * n * (n-1)*(3*m-n-1)/3 << endl; } return 0; }