【计数原理】【UVA11538】 Chess Queen

传送门

Description

  给你一个n*m的棋盘,在棋盘上放置一黑一白两个皇后,求两个皇后能够互相攻击的方案个数

Input

  多组数据,每组数据包括:

  • 一行,为n和m

  输入结束标志为n=m=0。

Output

  对于每组数据,输出:

  • 对应的放置方案数

Sample Input

2 2
100 223
2300 1000
0 0

Sample Output

12
10907100
11514134000

Hint

n,m≤1e6,n和m不全为1。保证最终答案在long long int范围之内

两个皇后能相互攻击,当且仅当他们在同一列,同一行,或同一斜线上。

黑白两个皇后位置相反算两种不同的方案。

Solution

  考虑两个皇后相互攻击的情况,显然相互之间没有包含关系,故而可以使用加法原理,分别求出方案数后相加。

  对于在同一列上的方案数,设这个棋盘是m行n列的,不妨设n≤m,先考虑放置一只皇后,那么对于这n列,每一列都有m种放置方法,即共有n*m种放置方法。再考虑放置另一个皇后,对于每一种方案,两个皇后相互攻击当且仅当后放的皇后在先放的皇后的那一列上的除先放的皇后所在位置之外的m-1个位置上。也就是对于每种放置第一只皇后的方案共有m-1个满足题意的方案。使用乘法原理,那么在同一列上的方案数就是n*m*(m-1)。

  同理易得,在同一行上的方案数是n*m*(n-1)。

  对角线上的元素同理。不同的是,对于一个n*m的棋盘,不妨设n≤m,其对角线长度如下:

  1,2,3,……n,n,n,……,3,2,1。其中共有(m-n+1)个n。

  只考虑一条斜线,那么这样的方案数就是(∑(i:1 to n-1) i*(i-1)) + n*(m-n+1)*(n-1)。化简这个式子。以下省略sigma后i的范围

  ∑i*(i-1)=∑i2-∑i。其中∑i=n(n-1)/2。对于∑i2,有如下结论:

  n(i=1)i2 = n(n+1)(2n+1)/6

  证明?能吃嘛?

  那么对于本题i∈[1,n-1],∑i2=(1/6)*n*(n-1)*(2n-4)。
  因为是两条对角线,所以需要×2。带入方案数的式子,斜线上的方案数就是

  2n(n-1)(3m-n-1)/3。

  将上面几种情况相加即得答案

Code  

#include<cstdio>
#define rg register
#define ci const int
#define LL unsigned long long int

namespace IO {
    char buf[50];
}

inline void qr(LL &x) {
    char ch=getchar(),lst=‘ ‘;
    while(ch>‘9‘||ch<‘0‘) lst=ch,ch=getchar();
    while(ch>=‘0‘&&ch<=‘9‘) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    if (lst==‘-‘) x=-x;
}

inline void write(LL x,const char aft,const bool pt) {
    if(x<0) {putchar(‘-‘);x=-x;}
    int top=0;
    do {
        IO::buf[++top]=x%10+‘0‘;
        x/=10;
    } while(x);
    while(top) putchar(IO::buf[top--]);
    if(pt) putchar(aft);
}

template <typename T>
inline T mmax(const T &a,const T &b) {if(a>b) return a;return b;}
template <typename T>
inline T mmin(const T &a,const T &b) {if(a<b) return a;return b;}
template <typename T>
inline T mabs(const T &a) {if(a<0) return -a;return a;}

template <typename T>
inline void mswap(T &a,T &b) {T temp=a;a=b;b=temp;}

LL n,m;

int main() {
    qr(n);qr(m);
    while(n||m) {
        if(n>m) mswap(n,m);
        write(n*m*(n-2+m)+2*n*(n-1)*(3*m-n-1)/3,‘\n‘,true);
        n=m=0;qr(n);qr(m);
    }
    return 0;
}

Summary

1、∑n(i=1)i2 = n(n+1)(2n+1)/6

2、看到1e6的题,如果因为答案大小限制了输入的大小,不妨往数学上想想,万一是O(1)的呢= =

原文地址:https://www.cnblogs.com/yifusuyi/p/9463157.html

时间: 2024-10-05 03:10:03

【计数原理】【UVA11538】 Chess Queen的相关文章

uva11538 Chess Queen

题目大意: chess中的皇后问题, 在一个n*m的范围内, 两个皇后能够相互攻击的摆放方式有多少种. /* 有三种相对摆放方式: 水平, 竖直, 对角线. 根据加法原理即可, 并且没有交集. 水平和竖直是一样的, 只要n*m矩形旋转90度. 所以结果是: n*m*(m-1)+n*m*(n-1); 对角线复杂些, 先来确定对角线的长度: 1,2,3,...,n-2,n-1,n,n,n,...,n,n,n-1,n-2,...,2,1; 其中n的个数是m-n+1 (其中假设m>n); 结果: 2*(

UVA11538 - Chess Queen(数学组合)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2533 题意:在n*m的棋盘上放两个(黑和白)相互攻击的皇后,求有多少种方法?  0<=(n,m)<=10e6; 下图是2*2的方案数12: 很明显要按行列还有对角三种来考虑,每种的方案数相加即可: 每一行我们要从m个格子中选择2个进行放所以方案数是m*(m-1),共有

【组合数学】计数原理

计数原理     ①抽屉原理               有N个抽屉,N+1个苹果,那么至少有一个抽屉有两个或两个以上的苹果.               有N个抽屉,N-1个苹果,那么至少有一个抽屉没有苹果.       ②加法原理         如果A类物品有a个,B类物品有b个,那么A类物品或B类物品共有a+b个(没有性质相同的情况下)       ③乘法原理         如果A有a中发生方式,B有b中发生方式,那么发生事件A与B有a*b中发生方式.       ④容斥原理 ∪=并

专题——计数原理

由于最近在研究数论,所以这期为大家带来一个数论中的专题--计数原理,下面我们来看四个概念: 一.配对原理: 对于集合A.B,如果存在一个一一映射,f:A→B,则|A|=|B|,假如我们很难计算A的值,不如转变方法,先计算B的值,再根据一一映射反推A,这时就需要找到这样一个易于计算的B,这需要很高的技巧.二.容斥原理: <1>容斥原理 把集合A分成子集A1,A2,A3,-,Am,即:A=A1∪A2∪A3-∪Am ,简单的来说,要求的集合是等于全集减去所有子集相交的重复的部分. <2>

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?

数学计数原理(P&#243;lya,高精度):SGU 294 He&#39;s Circles

He's Circles He wrote n letters "X" and "E" in a circle. He thought that there were 2n possibilities to do it, because each letter may be either "X" or "E". But Qc noticed that some different sequences of letters ca

[从头学数学] 第195节 计数原理

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了[九转金丹]之第五转的修炼. 这次要研究的是[计数原理]. 正剧开始: 星历2016年04月25日 10:22:16, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[计数原理]. <span style="font-size:18px;"> if (1) { var r = 20; config.setSector(1,10,1,1.5); config.graphPaper2D(0, 0

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

STM32F4_TIM基本延时(计数原理)

Ⅰ.概述 STM32的TIM定时器分为三类:基本定时器.通用定时器和高级定时器.从分类来看就知道STM32的定时器功能是非常强大的,但是,功能强大了,软件配置定时器就相对复杂多了.很多初学者甚至工作了一段时间的人都不知道STM32最基本的计数原理. 虽然STM32定时器功能强大,也分了三类,但他们最基本的计数部分原理都是一样的,也就是我们常常使用的延时(或定时)多少us.ms等. 接下来我会讲述关于STM32最基本的计数原理,详细讲述如何做到(配置)计数1us的延时,并提供实例代码供大家参考学习

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