zoukankan      html  css  js  c++  java
  • 【基本计数方法---加法原理和乘法原理】UVa 11538

    题目链接

    题意:给出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;

    代码如下

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 using namespace std;
     5 
     6 typedef unsigned long long ULL;
     7 
     8 int main()
     9 {
    10     ULL m, n;
    11     while(cin >> m >> n)
    12     {
    13         if(!m && !n) break;
    14         if(m<n) swap(m, n);
    15         ULL A = m*n*(n-1), B = n*m*(m-1);
    16         ULL D = 2*(n*(n-1)*(2*n-4)/3 + (m-n+1)*n*(n-1));
    17         cout << A+B+D << endl;
    18     }
    19     return 0;
    20 }
    View Code

      

          

  • 相关阅读:
    Levmar 配置
    函数前加static与不加static的区别
    关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决
    Latex 算法Algorithm
    matlab 曲线拟合
    生成eps图形
    libSVM在matlab下的使用安装
    spring 事务管理笔记
    集合框架
    小程序 滑动弹窗阻止主页面滑动
  • 原文地址:https://www.cnblogs.com/LLGemini/p/4373406.html
Copyright © 2011-2022 走看看