Chess Queen UVA - 11538(加法原理+sigma(i^2))

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)
/*
考虑加法原理,分成三类(没有重复)
行;列;对角线
1.行:     A(n,m)=n*m(m-1)         [排列]
2.列:     B(n,m)=A(m,n)=m*n*(n-1) [排列]
3.对角线: 考虑D(n,m) 考虑(n<=m),先考虑‘/'对角线
           1,2,3...n,n,n(m-n+1个)...3,2,1
           再考虑从 sigma(i*(i-1))从[1,n-1]求和,最后化简
           得到(n-1)*n*(2*n-1)/3-n*(n-1)
牢记:
sigma(i^2)[1,n]=n*(n+1)*(2*n+1)/6
*/
ll A(ll n,ll m){
    return n*m*(m-1);
}

ll B(ll n,ll m){
    return m*n*(n-1);
}

ll D(ll n,ll m){
    return (n-1)*n*(2*n-1)/3-n*(n-1)+(m-n+1)*n*(n-1);
}

int main(){
	ll n,m;
	while(scanf("%lld %lld",&n,&m)==2&&n){
        if(n>m)swap(n,m);
        ll ans=A(n,m)+B(n,m)+2ll*D(n,m);
        printf("%lld\n",ans);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值