排列 数学问题
只需要考虑同行、同列、同对角线的情况然后相加。
不妨设n<=m。
同行情况,先选择某一行(n),然后在这一行中选两个元素(m(m−1)),答案是mn(m−1)。
同列类似。
同对角线,对角线的长度可以看成两个1..n再加上m-n+1个n。后者答案是(m−n−1)n(n−1),前者答案是∑i=0ni(i−1)=n(n+1)(2n+1)6−n(n+1)2=n3−n3不要忘记有两个方向的对角线。
http://blog.csdn.net/sdfzyhx/article/details/53857797
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 long long n,m; 8 long long ans; 9 int main(){ 10 while(scanf("%lld%lld",&n,&m) && n){ 11 if(n>m)swap(n,m); 12 ans=2*(2*(n*n*n-n)/3+(m-n-1)*(n-1)*n)+m*n*(m-1)+m*n*(n-1); 13 cout<<ans<<endl; 14 } 15 return 0; 16 }