UVA 11538 - Chess Queen(数论+计数问题)

题目链接:11538 - Chess Queen

题意:给一个n*m棋盘,问放两个皇后,使得两个皇后互相能攻击到,有几种放法

思路:分横竖,对角线来考虑。

横:n * A(m, 2)种

竖:m * A(n, 2)种

对角线:由于有两条,可以算一条再乘2

2 * 所有对角线和(A(对角线格数,2))。

那么对角线格数为:(1, 2, 3, 4 ... n .n .n .n.n - 1. .. 4. 3 .2. 1) 然后为n的有m - n + 1条(m >= n)

所以答案为:2*(2*∑i*(i-1) + (m-n+1)*n*(n-1)) (1 <= i <= n - 1)

可以进行化简,*∑i*(i-1) (1 <= i <= n -1) = (n - 2) * (n - 1) * n / 3;

化简后得到式子为:n * m * (n + m - 2) + 2 * n * (n - 1) * (3 * m - n - 1) / 3

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

long long n, m;

int main() {
	while (~scanf("%lld%lld", &n, &m) && n || m) {
		if (n > m) swap(n, m);
		printf("%lld\n", n * m * (n + m - 2) + 2 * n * (n - 1) * (3 * m - n - 1) / 3);
	}
	return 0;
}

UVA 11538 - Chess Queen(数论+计数问题),码迷,mamicode.com

时间: 2024-10-13 22:31:33

UVA 11538 - Chess Queen(数论+计数问题)的相关文章

uva 11538 - Chess Queen(数论)

题目链接: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?

UVA - 11538 - Chess Queen (数论~)

11538 Chess Queen You probably know how the game of chess is played and how chess queen operates. Two chess queens are in attacking position when they are on same row, column or diagonal of a chess board. Suppose two such chess queens (one black and

uva 11538 - Chess Queen(组合数)

UVa  Online Judge https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2533 [题意] 给定一个棋盘,在棋盘上放两个皇后(一白一黑),求使得两个皇后相互攻击(在一行.一列.对角线均可相互攻击),求方案数. 计数问题,分类: 1.在一行或一列:n*m(m-1),m*n*(n-1) 2.在对角线,假设n<m,则各对角线长度

【组合计数】UVA - 11538 - Chess Queen

考虑把皇后放在同一横排或者统一纵列,答案为nm(m-1)和nm(n-1),显然. 考虑同一对角线的情况不妨设,n<=m,对角线从左到右依次为1,2,3,...,n-1,n,n,n,...,n(m-n+1个n),n-1,n-2,...,2,1 还有另一个方向的对角线,所以算出来之后要乘二. 即答案为2(2*Σ(i to n-1) (i(i-1))    +   (m-n+1)n(n-1)) Σ(i to n-1) (i(i-1))怎么算呢? 可以拆成Σi2 - Σi , i2的前缀和公式我就不推了

【基本计数方法---加法原理和乘法原理】UVa 11538 - Chess Queen

题目链接 题意:给出m行n列的棋盘,当两皇后在同行同列或同对角线上时可以互相攻击,问共有多少种攻击方式. 分析:首先可以利用加法原理分情况讨论:①两皇后在同一行:②两皇后在同一列:③两皇后在同一对角线( / 或 \ ): 其次利用乘法原理分别讨论: ①同一行时(A),先选某一行某一列放置其中一个皇后,共m*n种情况:其次在选出的这一行里的其他n-1个位置中选一个放另一个皇后:共m*n*(n-1)种情况: ②同一列时(B)情况相同,为n*m*(m-1)种情况: ③同一对角线(D)上时,先讨论 /

UVa 11538 Chess Queen

在n × m 的棋盘上放两个互相攻击的皇后,问有多少种方法 这道题重点不在于编程,而是数学公式的推导.其中还用到了Σ(i2)的公式,看来我高中数学没白学,嘎嘎 至于推导过程,看大白书吧,嘿嘿.对了,书中有一步貌似有个小错误,不过不影响结果 1 //#define LOCAL 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 int main(void) 7 { 8 #ifdef LOCAL

UVA 1073 - Glenbow Museum(数论+计数问题+递推)

题目链接:1073 - Glenbow Museum 白书上的例题,需要一定的推理. 首先要把问题转化,推理出n个点,R的个数为(n + 4) / 2, O的个数为(n - 4) / 2个,因为首先四个角必须为R,然后在中间添加O点,每有一个O点就要多一个R点,所以最后R点比O点多4. 然后问题就转化为给定n个R点和m个O点,求出有多少个序列,要求O点不连续,并且R的连续个数不能超过4,的序列个数. 可以设状态dp[i][j][2][2],表示用到第i个R点第j个O点,开头点,结尾点,的情况种数

UVA 11401 - Triangle Counting(数论+计数问题)

题目链接:11401 - Triangle Counting 题意:有1,2,3....n的边,求最多能组成的三角形个数. 思路:利用三角形不等式,设最大边为x,那么y + z > x 得 x - y < z < x 然后y取取值,可以从1取到x - 1,y为n时候,有n - 1个解,那么总和为0 + 1 + 2 +...+ (x - 2) = (x - 1) * ( x- 2) / 2; 然后扣除掉重复的y = z的情况,在y > x / 2时,每个y取值会出现一次y = z.

uva 278 - Chess(计数问题)

题目链接:uva 278 - Chess 题目大意:给出一个n*m的棋盘,并且给出棋子的种类,问说在这个大小的棋盘上最多能放几个给定的棋子,棋子之间不能互相攻击. 解题思路:总共有4种棋子,那么就分类讨论. 马(骑士): n或m为1的时候,肯定可以摆满,因为肯定不能互相攻击 n或者m为2时,这样放是最优的. 其他情况的或就是间隔放最优. 车:因为车的攻击方式是直线,所以每放一个车就会攻击到一列一行,所以答案就是n和m中最小的那个. 国王:国王的攻击范围是周围8个格子,所以放法就像考试隔排隔位一样