10行代码AC——UVA 11538-Chess Queen(数学规律+数列,附详细讲解)
生活随笔
收集整理的這篇文章主要介紹了
10行代码AC——UVA 11538-Chess Queen(数学规律+数列,附详细讲解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
勵志用盡量少的代碼做高效表達
提交(題目)連接——>UVA-11538
題目大意
求在n*m棋盤上放2個不一樣的皇后,且他們相互攻擊的方案數,也就是說,求2個不同的皇后在同一行、同一列或同一對角線的所有情況。
心路歷程
看到m、n的取值范圍和樣例的輸出值,太大了!先確定這是一道規律題。 并且用long long存儲。
首先找規律,找到規律后要么打表,要么推數學公式。
這道題可以采用分治的思想,將皇后攻擊的種類分成三部分考慮:同行攻擊,同列攻擊和同對角線攻擊。最后三部分相加。
同行攻擊:皇后A在每行中有n種放法,共m行。但在一行中皇后B只有n-1種放法。相乘得到n*m*(m-1)。
同列攻擊:同上,最后得:m*n*(n-1)
同對角線:設n≤m,所有/向的對角線,從左到右的長度依次為
有兩個方向的對角線,所以要乘2,得到如下公式:
對于
由于:1^2+2^2+3^2...+n^2 前n項和Sn=n(n+1)(2n+1)/6
因此有:S(n-1)=Sn-n=n(2n-1)(n-1)/6
對于
有:Sn=n(a1+an)/2
于是:
代碼展示:
#include<bits/stdc++.h> using namespace std; int main() {long long m, n; while(cin>>m>>n && m) {long long sum = 0;if(n > m) swap(m,n);sum = m*n*(n-1) + n*m*(m-1) + (2*n*(n-1)*(3*m-n-1))/3; cout << sum << endl;} return 0; }如果這篇文章對你產生了幫助,就請給博主一個小小的贊吧!大家的點贊是我創作的最大動力!
總結
以上是生活随笔為你收集整理的10行代码AC——UVA 11538-Chess Queen(数学规律+数列,附详细讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 38行代码AC——UVA-167The
- 下一篇: 最全!最完整的求first集和follo