题目链接

题意:给出m行n列的棋盘,当两皇后在同行同列或同对角线上时可以互相攻击,问共有多少种攻击方式。

分析:首先可以利用加法原理分情况讨论:①两皇后在同一行;②两皇后在同一列;③两皇后在同一对角线( / 或 \ );

   其次利用乘法原理分别讨论:

   ①同一行时(A),先选某一行某一列放置其中一个皇后,共m*n种情况;其次在选出的这一行里的其他n-1个位置中选一个放另一个皇后;共m*n*(n-1)种情况;

   ②同一列时(B)情况相同,为n*m*(m-1)种情况;

   ③同一对角线(D)上时,先讨论 / 方向对角线:

    为方便假设m>=n,则从左到右每条对角线长度依次为:

      1,2,3,... ...,n-1,n,n,... ...,n,n,n-1,... ... 3,2,1

    其中中间的n有(m-n+1)个;

    则共有: (1*0 + 2*1 + ... + (n-1)*(n-2)) * 2 + (m-n+1)*n*(n-1) 种情况;

    其中∑[1,n-1] (i*(i-1)) = ∑[1,n-1] (i*i - i) = ∑[1,n-1] (i*i) - ∑[1,n-1] (i) ;

    又∑[1,n-1] (i*i) = n*(n-1)*(2n-1) / 6; ∑(1,n-1) (i) = n*(n-1) / 2;

    则原式可化简为 n*(n-1)*(2n-4)/3 + (m-n+1)*n*(n-1);

      再加上 \ 对角线的情况,与上述相同,则D = 2*(n*(n-1)*(2n-4)/3 + (m-n+1)*n*(n-1));

    

    答案为A+B+D;

代码如下

 #include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std; typedef unsigned long long ULL; int main()
{
ULL m, n;
while(cin >> m >> n)
{
if(!m && !n) break;
if(m<n) swap(m, n);
ULL A = m*n*(n-), B = n*m*(m-);
ULL D = *(n*(n-)*(*n-)/ + (m-n+)*n*(n-));
cout << A+B+D << endl;
}
return ;
}

  

      

【基本计数方法---加法原理和乘法原理】UVa 11538 - Chess Queen的更多相关文章

  1. Uva 11538 - Chess Queen

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  2. uva 11538 Chess Queen<计数>

    链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...

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

    考虑把皇后放在同一横排或者统一纵列,答案为nm(m-1)和nm(n-1),显然. 考虑同一对角线的情况不妨设,n<=m,对角线从左到右依次为1,2,3,...,n-1,n,n,n,...,n(m ...

  4. UVa 11538 Chess Queen (排列组合计数)

    题意:给定一个n*m的棋盘,那么问你放两个皇后相互攻击的方式有多少种. 析:皇后攻击,肯定是行,列和对角线,那么我们可以分别来求,行和列其实都差不多,n*A(m, 2) + m*A(n, 2), 这是 ...

  5. 组合数学 UVa 11538 Chess Queen

    Problem A Chess Queen Input: Standard Input Output: Standard Output You probably know how the game o ...

  6. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

  7. 【spring data jpa】jpa中使用count计数方法

    spring data jpa中使用count计数方法很简单 直接在dao层写方法即可 int countByUidAndTenementId(String parentUid, String ten ...

  8. 【概率论】1-2:计数方法(Counting Methods)

    title: [概率论]1-2:计数方法(Counting Methods) categories: Mathematic Probability keywords: Counting Methods ...

  9. UVa 11538 象棋中的皇后

    https://vjudge.net/problem/UVA-11538 题意: n×m的棋盘,有多少种方法放置两个相互攻击的皇后? 思路: 这两个皇后互相攻击的方式只有3种,在同一行,在同一列,或在 ...

随机推荐

  1. work_7

    1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理解 局部变量分为动态局部变量和静态局部变量,其共同点为作用域均为定义它的函数体或语句块,其不同点为其生命周期 ...

  2. JAVA中的常见面试题1

    1.线程同步的方法的使用. sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常. wait():使一个线程处于等待状态,并且 ...

  3. ubuntu下修改时区

    使用一个虚拟机服务,其时区设置的为格林兰标准时区,我北京时区在东八区,较其快八个小时. 修改时区需要执行 tzselect 一步步选择下来,注意确认后的information Therefore TZ ...

  4. poj 1469 COURSES(匈牙利算法模板)

    http://poj.org/problem?id=1469 COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:  ...

  5. 计算两个日期相隔的天数(jodd)

    public static void main(String[] args) throws ParseException { System.out.println(TimeUtil.dayOfYear ...

  6. Line去年营收超5亿美元 远超竞争对手WhatsApp

    原文地址: http://news.cnblogs.com/n/206072/ 凭借着修改表情取悦国际用户的做法,日本移动消息应用 Line 在全球的用户总数已经超过 4 亿.Line.微信.What ...

  7. 我的VisualStudio工具箱

    代码神器 ReSharper 毫无疑问,我认为R#是目前VS插件中有史以来最强大的,各种快捷生成代码的方式, 代码重构, 很多很多的快捷键支持.相比较原生VS的,VS的智能功能简直弱爆了. dimec ...

  8. VBScript连接数据库

    'access类型 dim strconn,objconn strconn="driver=microsoft access driver(*.mdb);dbq=" _ & ...

  9. [Angular 2] *ngFor

    heros.ts: import {Component} from "@angular/core"; const HEROES = [ {id: 1, name:'Superman ...

  10. [Javascript] Function scope

    We have code like: var numbers = [1,2,3]; for(var i in numbers){ setTimeout(function(){console.log(n ...