UVa11538 (水题+找规律)

题意

给一个m行n列的方格,让你在方格里面放两个皇后,红皇后和白皇后,两个皇后在同一行,同一列或者同一对角线就可以互相攻击,问你有多少种让他们互相攻击的方案。

分析

首先问题可以分成三部分之和,在同一行,在同一列和在同一对角线三种情况。这三个是相互独立的。对于同一行和同一列很好求,同一对角线找规律可以发现会有 m + n 1 个。然后每个对角线都是 1 , 2 , 3... n , n . . .3 , 2 , 1 个地方,那对于格子数为i的对角线,方案就是i*(i-1),本来1是不算的,但是按照这个公式,1也是满足的。再考虑中间相同的个数,这个找规律可以发现等于(m-n+1)个,这里假设m是大于的,我们也可以看出,如果n==m这个临界状态中间只有一个。那么后可以将这种情况的答案又分成两个部分,一个是递增然后递减的数列,另一个是中间相同的数量。这里可以看到先递增然后递减的话最大的那个值是m和n中最大的那个减去1,因为我们把最大的算成是第二种情况,也就是相等的情况。所以让i从1开始加到n-1.同样的,这里我们也是假设n<=m.完了以后对角线的情况就是i(i-1)(i从1到n-1)求和+(m-n+1)*n(n-1)(m-n+1个n,每个n都有n(n-1)种方案),这个可以化简。最后加上前面的两种情况,看代码吧。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int main()
{
    ios::sync_with_stdio(false);
    ll a, b;
    while (cin >> a >> b && a&&b)
    {
        ll ans = 0;
        if (a > b) swap(a,b);
        cout << a * b*(a + b - 2) + 2 * a*(a - 1)*(3 * b - a - 1) / 3 << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cugsl/article/details/81747132