uva 11538 - Chess Queen 先分步还是先分类? 计数问题

来源:互联网 发布:有什么好用的水乳 知乎 编辑:程序博客网 时间:2024/05/28 05:16

题目链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2533



计数问题可以先考虑分类,也可以先考虑分步,采取不同方式后续处理也会不同。


那道题目我想到的是先分布(*),大致是先排组合(选位置)  ,后排列( )


因为一开始题目没读清楚,弄不清有黑白之分,还有没有注意到皇后可以斜着攻击,思维混乱。


看了答案,是先分类(+),两个皇后在同一行、同一列、同一斜线。


如果是直接先分布(  C(m*n,2) ),很难算清楚,会重复,而且重复了多少次很难算清楚。


证明适当的时候分类是必要的


算在同一斜线的数量时候,注意有两个方向'/' , '\'的。


对于long long ,6*   10^18是不会超的


刘汝佳的书提示用unsigned long long(最大大约1.8*10^9)


#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<climits>#include<queue>#include<vector>#include<map>#include<sstream>#include<set>#include<stack>#include<utility>#pragma comment(linker, "/STACK:102400000,102400000")#define PI 3.1415926535897932384626#define eps 1e-10#define sqr(x) ((x)*(x))#define FOR0(i,n)  for(int i=0 ;i<(n) ;i++)#define FOR1(i,n)  for(int i=1 ;i<=(n) ;i++)#define FORD(i,n)  for(int i=(n) ;i>=0 ;i--)#define  lson   num<<1,le,mid#define rson    num<<1|1,mid+1,ri#define MID   int mid=(le+ri)>>1#define zero(x)((x>0? x:-x)<1e-15)#define mk    make_pair#define _f     first#define _s     secondusing namespace std;const int INF =0x3f3f3f3f;//const int maxn=    ;//const int maxm=    ;//const int INF=    ;typedef long long ll;const ll inf =1000000000000000;//1e15;//ifstream fin("input.txt");//ofstream fout("output.txt");//fin.close();//fout.close();//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);//by yskysker123ll n,m;int main(){   while(~scanf("%lld%lld",&m,&n)&&(m||n))   {       if(m<n)  swap(m,n);        ll ans=2*n*(n-1)*(-n-1+3*m)/3+ m*n*(m+n-2);       printf("%lld\n",ans);   }    return 0;}





0 0
原创粉丝点击