uva11538 Chess Queen(组合数学)

来源:互联网 发布:js让金额不为0 编辑:程序博客网 时间:2024/05/20 08:23
非常有思想的数学题 意思就是给一个n*m的矩阵 放一黑一白两个皇后多少种方法 要相互攻击到的
这样要分三种情况
第一种两个皇后 在一排
那么总数是 n*m*(m-1)//n*m为放第一个, 在那一行剩余的 (m-1)个位置放另一个
第二种两个皇后在一列
总数是 n*m(n-1)
第三种略微复杂 是在对角线方向的。
开始想的是对于 每一个坐标 通过坐标去确定多少个  但是这算法明显不好
其实可以把对角线当做行或列 只是能放的位置不同
假设n<=m
列出所有斜线上的方块总数 1,2,3,4,...n-1.之后是m-n+1个n,之后在循环之前的。
那么直接for循环 计算 阶乘全加起来就行了
先算2到n-1的 然后乘以2
再处理n的情况
最后乘以2 因为对角线有两种方向

注意这个题爆long long !!!
 tepydef unsigned long long LL;

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;typedef unsigned long long LL;int main(){    LL n,m;    LL ans,tmp;    while(cin>>n>>m)    {        if(n==0 && m==0)        break;        if(n>m)        swap(n,m);        ans=0;        ans+= n*m*(m-1);        ans+= n*m*(n-1);        tmp=0;        for(LL i=2;i<n;++i)        tmp+= i*(i-1);        tmp*=2;        tmp+=(m-n+1)*n*(n-1);        tmp*=2;        ans+=tmp;        cout<<ans<<endl;    }    return 0;}


原创粉丝点击