
数学counting
文章平均质量分 58
incredible_bly
这个作者很懒,什么都没留下…
展开
-
数学专项counting:UVa 10079
很简单找规律,结果为(n*n+n+2)/2。#include #include #include #include using namespace std;typedef long long LL;LL n;int main(){ freopen("in.txt","r",stdin); while(cin>>n) { if(n<0) b原创 2013-03-28 22:56:41 · 475 阅读 · 0 评论 -
数学专项counting:UVa 10237
先将棋盘染成2种颜色,可以发现可以将棋盘的格子分成2种互不相关的类型。每种类型按对角线长度的奇偶性分类,同一类型的行列不能出现多个bishop。为了递推,可以将所有行按升序排列。f1[i][j]表示对角线长度为奇数的第i行有j个bishop的方案数;f2[i][j]表示对角线长度为偶数的第i行有j个bishop的方案数。递推式为f[i][j]=f[i-1][j]+(c-j+1)*f[i原创 2013-11-08 23:27:18 · 864 阅读 · 0 评论 -
数学专项counting:UVa 11481
题目大意就是求N个数的排列中有多少个前M个数恰有M-K个错牌。这里可以先从前M个数中选K个数不变,即C(M,K)种。然后问题就转化为求n个数前m个数错排的排列数。递推方程为:f[i][j]=(i-j)*f[i-1][j-1]+(j-1)*f[i-1][j-2];边界条件为:f[i][0]=i!。#include #include #include using namespac原创 2013-10-16 23:12:13 · 623 阅读 · 0 评论 -
数学专项counting:LA 4064
即求平面上n个点共能构成多少个锐角三角形和直角三角形。我的方法是先统计钝角的总数,然后用C(n,3)减去即可。钝角统计的方法:枚举原点,将剩下的点级角排序,然后二根扫描线扫,即可统计钝角个数。这里需要注意精度问题。#include #include #include #include #include using namespace std;const int maxn=250原创 2013-10-08 23:36:45 · 697 阅读 · 0 评论 -
数学专项counting:UVa 11529
问题实质上是求平面上的n个点一共可以构成多少个凹四边形,方法就是先选定一个点作为原点,然后将剩下的点级角排序,然后扫一遍,统计在原点的一侧共能形成多少个三角形,即凹四边形的个数。累加即为最终的结果。#include #include #include #include #include using namespace std;typedef long long LL;cons原创 2013-10-08 23:26:22 · 529 阅读 · 0 评论 -
数学专项counting:LA 3295
就是分类统计,分3类。第一种是一条水平的或竖直的边,数目为所有对角线条数的两倍;第二种是有一条水平的边和一条竖直的边,数目为所有对角线条数的(2*n+2*m-4)倍;第三类是3条边均不是水平或竖直的,先从n+1条水平边中任取3条,即C(n+1,3),再在m+1条竖直边取3条边的排列,即P(m+1,3),利用乘法原则,总数为C(n+1,3)* P(m+1,3),但此处多算了3点共线的情况,只要在计算原创 2013-09-18 22:59:08 · 807 阅读 · 0 评论 -
数学专项counting:LA 3720
这道题的关键是枚举对角线的斜率,当枚举的矩形的长宽互质时,则该斜率第一次出现,将所有满足该长宽的对角线加上。这样,这些矩形的长宽的2倍的矩形被重复计算了一次,所以当长宽的gcd为2时,要将其扣除。这样,即得结果。#include #include #include #include using namespace std;typedef long long LL;const i原创 2013-09-18 22:43:58 · 916 阅读 · 0 评论 -
数学专项counting:LA 3357
很容易推出长度为i的串所包含的数为一个斐波那契数列。然后就很容易了,先推出串的长度,然后递归打印就行了。不过打印的时候必须把性质推清楚,不然很容易出问题。#include #include using namespace std;int f[50],d[50];void print(int dep,int cur){ if(dep==2) { if(c原创 2013-05-18 22:09:34 · 564 阅读 · 0 评论 -
数学专项counting:UVa 580
用d[i]表示i个cubes的方法数,递推式为:d[i]=sum{(2^(i-j-4)-d[i-j-4])*2^j|0#include #include #include using namespace std;int d[35],p[32];int main(){ p[0]=1; for(int i=1;i<=30;i++) p[i]=p[i-1]原创 2013-05-17 22:20:14 · 647 阅读 · 0 评论 -
数学专项counting:UVa 417
因为数据规模很小,可以直接暴力出一个5维的表,然后直接输出结果就可以了。因为要写5重循环,利用宏定义会比较方便。#include #include #include using namespace std;#define FOR(i,s,t) for(int i=s;i<=(t);i++)int d[27][27][27][27][27];int digit[10];int ma原创 2013-05-17 22:21:18 · 551 阅读 · 0 评论 -
数学专项counting:LA 5846
lrj书上已经给出了非常详细的讨论,结果即为C(n,3)-1/2*Sum(ai*(n-1-ai)),其中ai指的是每个点所连红边(或蓝边都行)的数量。#include #include #include #include using namespace std;#define M 1010int n;int a[M];int main(){ freopen("in.t原创 2013-03-26 22:48:20 · 769 阅读 · 0 评论 -
数学专项counting:UVa 11038
纠结了很长时间,最后写出来了一段比较搓的代码,把样例和UVa论坛上的测试数据都过了,可就是WA……最后只能搜解题报告,才知道用排列组合可以相当巧妙的解出来。大概思想就是逐位考虑该位出现0的情况,具体就是用左边的排列数乘以右边的组合数,分该位为0和不为0两种情况考虑。具体的看代码吧,参考了网上的解题报告,有不懂自行google吧。#include #include #include #原创 2013-03-15 22:59:59 · 606 阅读 · 0 评论 -
数学专项counting:UVa 10883
不难发现结果可用二项式定理表示,即:sum{C(n-1,i)*a[i]/2^(n-1)}。本来以为是道水题,结果精度问题搞得我WA了n次。因为n太大,直接乘除肯定会溢出。所以先求log一下,然后再exp一下,组合数可以通过logC(n,k+1)=logC(n,k)+log(n-k)-log(k+1)递推得到。另外,因为a[i]可能为负数,所以在取对数的时候还得特殊处理一下。#include原创 2013-03-15 23:04:38 · 979 阅读 · 0 评论 -
数学专项counting:UVa 10081
递推关系很容易得出,而且数据最大为10^100,所以用double类型储存数据即可,无需使用高精度。#include #include #include #include #include using namespace std;int n,k;double dp[110][12];int vis[110][12];double dfs(int dep,int i){原创 2013-03-28 22:59:50 · 523 阅读 · 0 评论 -
数学专项counting:UVa 10128
设状态f[i][l][r]表示队中有i个人,从左往右看有l个人,从右往左看有r个人。此时要往i+1个人的队列的状态转移时,不妨设,新添的人是最矮的。那会有三种情况,要么添在最左,即f[i+1][l+1][r];要么添在最右,即f[i+1][l][r+1];要么添在中间,即f[i+1][l][r],此时会有i-1个位置可以放。这样既可递推出结果了。#include原创 2013-11-08 23:35:02 · 743 阅读 · 0 评论