2.1 基本计数方法

例题1 uva 11538 http://acm.hust.edu.cn/vjudge/problem/28978

在m*n棋盘上放置 黑白两个皇后,相互攻击的方法数.

解法,正着考虑, 同行,同列, 斜着的情况加在一起, 组合书计算一下, 黑白不同 所以是 P(n,2).

对斜着的角的情况暴力算也过. 1760ms

 1 //#define txtout
 2 //#define debug
 3 #include<bits/stdc++.h>
 4 #define mt(a,b) memset(a,b,sizeof(a))
 5 using namespace std;
 6 typedef long long LL;
 7 const double pi=acos(-1.0);
 8 const double eps=1e-8;
 9 const int inf=0x3f3f3f3f;
10 const int M=1e5+10;
11 int n,m;
12 LL getRow(int r,int c){
13     return 1LL*c*(c-1)*r;
14 }
15 LL getFirst(int r){
16     LL sum=0;
17     for(int i=2;i<=r;i++){
18         sum+=1LL*i*(i-1);
19     }
20     return sum;
21 }
22 LL get(int r,int c){
23     int small=min(r,c);
24     int sub=max(r,c)-small+1;
25     return getRow(sub,small)+2*getFirst(small-1);
26 }
27 LL solve(){
28     return getRow(n,m)+getRow(m,n)+get(n,m)+get(m,n);
29 }
30 int main(){
31     #ifdef txtout
32     freopen("in.txt","r",stdin);
33     freopen("out.txt","w",stdout);
34     #endif // txtout
35     while(~scanf("%d%d",&n,&m),n|m){
36         printf("%lld\n",solve());
37     }
38     return 0;
39 }

对斜着的角的预处理, 快非常多. 0ms

 1 //#define txtout
 2 //#define debug
 3 #include<bits/stdc++.h>
 4 #define mt(a,b) memset(a,b,sizeof(a))
 5 using namespace std;
 6 typedef long long LL;
 7 const double pi=acos(-1.0);
 8 const double eps=1e-8;
 9 const int inf=0x3f3f3f3f;
10 const int M=1e6+10;
11 int n,m;
12 LL sum[M];
13 void init(){
14     sum[0]=0;
15     sum[1]=0;
16     for(int i=2;i<M;i++){
17         sum[i]=sum[i-1]+1LL*i*(i-1);
18     }
19 }
20 LL getRow(int r,int c){
21     return 1LL*c*(c-1)*r;
22 }
23 LL getFirst(int r){
24     return sum[r];
25 }
26 LL get(int r,int c){
27     int small=min(r,c);
28     int sub=max(r,c)-small+1;
29     return getRow(sub,small)+2*getFirst(small-1);
30 }
31 LL solve(){
32     return getRow(n,m)+getRow(m,n)+get(n,m)+get(m,n);
33 }
34 int main(){
35     #ifdef txtout
36     freopen("in.txt","r",stdin);
37     freopen("out.txt","w",stdout);
38     #endif // txtout
39     init();
40     while(~scanf("%d%d",&n,&m),n|m){
41         printf("%lld\n",solve());
42     }
43     return 0;
44 }

end

时间: 2024-10-12 04:31:40

2.1 基本计数方法的相关文章

数学基础——基本计数方法

计数方法最基础的两个原理是:加法原理和乘法原理. 容斥原理: 假设一个班里有10个学生喜欢数学,15个学生喜欢语文,21个学生喜欢编程.那么班级总人数: |A∪B∪C| = |A| + |B| + |C| - |A∩B| - |A∩C| - |B∩C| + |A∩B∩C| 一般的,任意多个集合,集合内的元素个数为奇数,前面的符号为正. 问题1:排列问题 n个不同的数,选k个排成1排,有多少种排法. 答案计做p(n,k) = n*(n-1)*(n-2)*...*(n-(k-1)) = n!/(n-

学习总结--数学.基本计数方法

学习总结--数学.基本计数方法 一.计数方法的原理 1.加法原理:做一件事情有n中办法,第i种办法有pi种执行方案,那么总的解决这件事情的方案数即为p1+p2+p3+...+pn. 2.乘法原理:做一件事情分为n个步骤,第i个步骤的执行方案有pi种,则一共有p1?p2?p3?...?pn种方案解决该问题. 3.容斥原理:一个班级有,集合A的人喜欢数学,集合B的人喜欢英语,结合C的人喜欢语文,那么该班级的人数应该是多少? 如果我们将三个集合的人数相加起来,那么就重复计算了既喜欢数学又喜欢英语的.既

【组合数学】 05 - 经典计数方法

1. 基本计数的母函数 现在来用母函数来求解基本计数问题,母函数既可以完成自动计数,还能表示计数本身,像Stirling数这种就只能用母函数表示.自动计数适用于可以分步的计数问题,并且目标值是每步值之和,这与多项式的运算性质有关. 1.1 组合数和分划数 直观上最符合这一特点的就是模型2,从\(n\)个可区别对象中选出\(m个\).限制第\(k\)个对象被取的次数在集合\(M_k\)中,它被选情况的母函数是\(\sum\limits_{i\in M_k}x^i\),所有元素被选择的情况可以借助母

算法竞赛入门经典行训练指南【计数方法】------2015年1月23日

基础知识整理: (1)加法原理 (2)乘法原理 (3)容斥原理(注意变式问题) (4)排列组合公式的应用及变形: 排列的公式: 其变形为: 与组合的关系如下(以下第一个公式很重要): 排列组合公式的重要推论: 推论1: 对于第一个物体如果不取的话,那么我们有C(n,k+1)种方法,对于第一个物体取的话,我有C(n,k)种方法.公式得证. 推论2: 这可以降低求解二项式系数的时间复杂度,通过利用递推关系自小到大依次计算得出,方便快捷. (5)排列组合的基本问题: Q1:求有重复元素的排列. 有k个

php导出excel长数字串显示为科学计数方法与最终解决方法

1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->setTitle('Simple');//设置A3单元格为文本 $objPHPExcel->getActiveSheet()->getStyle('A3')->getNumberFormat()->setFormatCode(PHPExcel_

算法竞赛训练指南2.1 计数方法

1. O(n)方法求C(n,m) 利用公式C(n,k+1)=C(n,k)*(n-k)/(k+1) 模板: #include <iostream> #include <algorithm> using namespace std; typedef unsigned long long LL; const int maxn=100005; LL n,m; LL C() { if(m==0||n==m) return 1; if(m>n-m) m=n-m; LL ans,temp=

计数方法,博弈论(扫描线,树形SG):HDU 5299 Circles Game

There are n circles on a infinitely large table.With every two circle, either one contains another or isolates from the other.They are never crossed nor tangent.Alice and Bob are playing a game concerning these circles.They take turn to play,Alice go

计数方法(扫描线):JLOI 2016 圆的异或并

Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的 圆.保证|x|,|y|,≤10^8,r>0,N<=200000 Output 仅一行一个整数,表示所有圆的异或面积并除以圆周率Pi的结果. Sample

【基本计数方法---加法原理和乘法原理】UVa 11538 - Chess Queen

题目链接 题意:给出m行n列的棋盘,当两皇后在同行同列或同对角线上时可以互相攻击,问共有多少种攻击方式. 分析:首先可以利用加法原理分情况讨论:①两皇后在同一行:②两皇后在同一列:③两皇后在同一对角线( / 或 \ ): 其次利用乘法原理分别讨论: ①同一行时(A),先选某一行某一列放置其中一个皇后,共m*n种情况:其次在选出的这一行里的其他n-1个位置中选一个放另一个皇后:共m*n*(n-1)种情况: ②同一列时(B)情况相同,为n*m*(m-1)种情况: ③同一对角线(D)上时,先讨论 /

UVA计数方法练习[3]

UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 // // Created by Candy on 24/10/2016. // Copyright © 2016 Candy. All rights reserved. // #include <iostream> #include <cstdio> #include <cst