【计数原理】【UVA11538】 Chess Queen

本文介绍了一道关于在棋盘上放置两个皇后并计算互相攻击方案数目的问题。通过数学方法推导出了高效的O(1)算法,并给出了具体实现。

传送门

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

在车辆工程中,悬架系统的性能评估和优化一直是研究的热点。悬架不仅关乎车辆的乘坐舒适性,还直接影响到车辆的操控性和稳定性。为了深入理解悬架的动态行为,研究人员经常使用“二自由度悬架模型”来简化分析,并运用“传递函数”这一数学工具来描述悬架系统的动态特性。 二自由度悬架模型将复杂的车辆系统简化为两个独立的部分:车轮和车身。这种简化模型能够较准确地模拟出车辆在垂直方向上的运动行为,同时忽略了侧向和纵向的动态影响,这使得工程师能够更加专注于分析与优化与垂直动态相关的性能指标。 传递函数作为控制系统理论中的一种工具,能够描述系统输入和输出之间的关系。在悬架系统中,传递函数特别重要,因为它能够反映出路面不平度如何被悬架系统转化为车内乘员感受到的振动。通过传递函数,我们可以得到一个频率域上的表达式,从中分析出悬架系统的关键动态特性,如系统的振幅衰减特性和共振频率等。 在实际应用中,工程师通过使用MATLAB这类数学软件,建立双质量悬架的数学模型。模型中的参数包括车轮质量、车身质量、弹簧刚度以及阻尼系数等。通过编程求解,工程师可以得到悬架系统的传递函数,并据此绘制出传递函数曲线。这为评估悬架性能提供了一个直观的工具,使工程师能够了解悬架在不同频率激励下的响应情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值