紫书第十章
BEconfidence
坚持才是胜利之道
展开
-
UVa10820 - Send a Table
输入n,求有多少个二元组满足1设满足x对照欧拉函数定义:f(n) = phi(2)+phi(3)+。。。+phi(n)时间复杂度O(nloglogn)欧拉函数:n = p1^a1 × p2^a2 × … × pk^ak where p1 … pk are primesφ(n) = n × (1 - 1/p1) × (1 - 1/p2) × … × (1原创 2015-05-02 13:26:50 · 567 阅读 · 0 评论 -
UVa1213 - Sum of Different Primes(素数表+DP)
题意是选择k个质数使其和为n,先搞一个素数表然后dp,dp[i][j]表示选了j个数和位i的方案数。#include#define foreach(it,v) for(__typeof((v).begin())it=(v).begin();it!=(v).begin();++it)using namespace std;typedef long long ll;const int ma原创 2015-05-12 15:54:20 · 1203 阅读 · 0 评论 -
UVa808 - Bee Breeding(坐标法)
题意:给定图中蜂窝两点,求最短距离思路:建坐标系,然后根据图中走的顺序把每个点的坐标求出来,然后利用坐标去求最小距离#include#include#include#includeconst int N = 20005;const int d[5][2]={{-1,1},{0,2},{1,1},{1,-1},{0,-2}};struct Point{ int x原创 2015-05-12 14:49:37 · 1496 阅读 · 0 评论 -
UVa12169 - Disgruntled Judge(模运算)
如果知道了a,就能算出x2,根据x3=(ax2+b)mod10001算出b。然后可在O(T)时间内计算出整个序列。如果在计算中发现和输入矛盾,则a非法,因为a是0~10000的整数,即使枚举所有a,时间效率也足够高。枚举a,利用x1,x3求出b,判断所有x的关系能不能满足a,b。如何通过a,x1,x3求出b呢。x2 = (a * x1 + b) % 10001;x3 =原创 2015-05-01 14:11:39 · 1316 阅读 · 0 评论 -
1393 - Highways(问题抽象)(容斥原理计数)
问题的方向是对称的,统计\*2即可,当gcd(a,b)>1及重复,证:a*b满足gcd(a,b)>1,在他对角线和a'和b'对角线是同一条直线(a'=a/gcd(a,b)b'=b/gcd(a,b))其次,如果放置位置不够靠左,也不够靠上,则它和它“左上方”的包围盒也重复了假定左上角坐标(0,0)则对于左上角在(x,y)的包围盒,其左上方的包围盒的左上角为(x-a,y-b),这个左上角合原创 2015-05-12 13:42:47 · 756 阅读 · 0 评论 -
UVa11040 - Add bricks in the wall (规律递推)
找规律的题【x】【a】【x-a】【y】 【 】【z】 这里面xyz都已知,所以可以求出a = (x + y - z ) /2#includeint a[9][9];int main(){ int t; scanf("%d",&t); while(t--){ for(int i=0;i<9;i+=2)原创 2015-05-12 14:21:51 · 1097 阅读 · 0 评论 -
杨辉三角形与二项式定理
递推求(a+b)^n中所有项系数:时间复杂度O(n^2)1。利用递推公式#include#includeusing namespace std;int C[11][11];int main(){ memset(C,0,sizeof(C)); for(int i=0;i<=10;i++){ C[i][0]=1; for(int j=1原创 2015-05-01 18:24:00 · 932 阅读 · 0 评论 -
UVa10491 - Cows and Cars(概率)
题目大意:给出a,b和c,表示有a + b 个门, a个后面是牛, b个后面是车, 然后你从中选一个门,之后有一个知情人帮你打开c个后面是牛的门(因为1≤c解题思路:问题可以分成两种情况:1)第一次选中牛的时候,a/(a + b), 然后打开c个后面是牛的门,总关门数为(a + b - c - 1),然后还有b个门后面是车,所以p1 = a * b / (a + b)原创 2015-05-05 20:42:04 · 545 阅读 · 0 评论 -
UVa1262 - Password(暴力枚举)
题意:给出两个6行5列的字母矩阵,一个密码满足:密码的第i个字母在两个字母矩阵的第i列均出现。然后找出字典序为k的密码,如果不存在输出NO分析:我们先统计分别在每一列均在两个矩阵出现的字母,然后从小到大排好序。对于第一个样例来说,我们得到ACDW、BOP、GMOX、AP、GSU则一共有4×3×4×2×3=288种密码,我们先计算这个数列的后缀积:28原创 2015-05-05 21:00:55 · 1337 阅读 · 0 评论 -
UVa12716 - GCD XOR(数论数学构造)
做出做道题需要注意2个地方:首先可以打表找规律,找到规律我们可以发现:1.如果gcd(a,b) = a ^ b = c,那么 b = a - c;既然这样我们可以枚举a,c,求出b之后判断 c 是否等于 a ^ b,那么如何枚举c呢?2.利用类似筛选素数的方法去枚举a,c首先c是a的约数,所以这道题我们需要枚举的其实是a的约数,但是约数也不好枚举,我们可以通原创 2015-05-05 21:27:36 · 442 阅读 · 0 评论 -
UVa 10791 Minimum Sum LCM
数学题题意(就是因为读错题意而wa了一次):给一个数字n,范围在[1,2^23-1],这个n是一系列数字的最小公倍数,这一系列数字的个数至少为2例如12,是1和12的最小公倍数,是3和4的最小公倍数,是1,2,3,4,6,12的最小公倍数,是12和12的最小公倍数………………那么找出一个序列,使他们的和最小,上面的例子中,他们的和分别为13,7,28,24……显然最小和为7原创 2015-05-05 21:39:31 · 611 阅读 · 0 评论 -
UVa10375 - Choose and divide
题意:给定p,q,r,s。求c(p,q) / c(r, s)。思路:由于c(n,m)分子和分母数是相等的,所以可以进行一除一乘。就不会超过范围代码:#includeint p,q,r,s,i;double ans;int main(){ while(~scanf("%d%d%d%d",&p,&q,&r,&s)){ ans=1.0;原创 2015-05-05 21:44:02 · 902 阅读 · 0 评论 -
UVa12230 - Crossing Rivers (数学期望)
题意:给你A和B的距离,以及途中n条河的信息,问你从A到B的期望思路:我们单纯算过河时间的话,最快的是l/v,最慢的可能是3l/v,期间的时间是线性的,所以期望就是4l/2v=2l/v#include#include#include#includeint main(){ int n; double p,l,v,d; int cas=1; while(原创 2015-05-06 22:02:28 · 787 阅读 · 0 评论 -
UVa1639 - Candy(期望+对数精度处理)
注意题意是开始两个盒子各有n个糖果,等吃完就只有两种情况,盒子1没了,或者盒子2没了。这完全是个求概率期望的数学问题。借用二项分布公式:P(ξ=K)= C(n,k) * p^k * (1-p)^(n-k), 其中C(n, k) = n!/(k! * (n-k)!)注意!:第二个等号后面的括号里的是上标,表示的是方幂。得出第i次打开盒子1没糖的概率C(2n-1,n)p^(n+1)(1原创 2015-05-08 08:35:07 · 1561 阅读 · 0 评论 -
UVa1643 - Angle and Squares(几何)
有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值。分析:直观上来看,当这n个正方形的对角线在一条直线上时,封闭区域的面积最大。(虽然我不太会证明,=_=||)设所有正方形边长之和为L,OA、OB两直线方程分别为:y = k1x y = k2x,设A(x1, k1x1), B(x2, k2x2),可列出方程:原创 2015-05-12 15:34:38 · 1315 阅读 · 1 评论 -
UVa11214 - Guarding the Chessboard
给出m*n棋盘上的目标点,求最少用几个皇后可以守卫所有目标点。 类似八皇后做法,2维数组标记行、列、主对角线、副对角线。 有个加速的技巧,测试之后发现10*10的棋盘全部守卫至少需要5个,所以上限就是5,当maxd等于5时直接输出,不进行搜索。#include#includeusing namespace std;const int maxn=11;int n,m,t,maxd原创 2015-05-03 13:08:35 · 2111 阅读 · 0 评论 -
UVa11346 - Probability (连续概率)
1.首先是把范围见笑到第一象限,因为四个是一样的。2.把求上部分的面积变为求下部分的面积(积分求解)3.面积为:s+s*f(a,s/b)1/xdx 化简为s+s*ln(a*b/s)4.结果为:m=a*b (s - s - s*ln(m/s))/m5.以上做法的前提是双曲线和所求区域相交,注意两个特判:1.s>ab时,概率为0 2.s接近0,概率为1#include#i原创 2015-05-08 14:52:34 · 975 阅读 · 0 评论 -
UVa11971 - Polygon(连续概率)
紫书上推出来的公式1-(k+1)/2^(k)注意范围 都用的long long#include#include#includeusing namespace std;typedef long long ll;ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}int main(){ int n,kase=1; s原创 2015-05-08 15:21:21 · 1079 阅读 · 0 评论 -
UVa1635 - Irrelevant Elements(组合数)
题意:整个式子的和可以 化简为 sigma (C(n-1,i-1)*ai)思路:只要判断C(n-1,i-1)能否被 m整除即可。做法是先分解m的质因数,然后计算1!~(n-1)! 包含m的质因数的个数C(n-1,i-1) = (n-1)!/((i-1)!*(n-i)!) 只要判断 剩下的质因数的个数是否大于等于m的任一个质因数的个数即可#include原创 2015-05-02 13:47:32 · 983 阅读 · 0 评论 -
UVa1640 - The Counting Problem(数位统计)
题意: 统计两个整数a,b之间各个数字(0~9)出现的次数,如1024和1032,他们之间的数字有1024 1025 1026 1027 1028 1029 1030 1031 1032 总共有10个0,10个1,3个3等等。分析: 因为前导0的干扰,为了计算方便暂时都先计算在内,之后再减; 如果是0~199,那么百位上的0和1各出现一次,s剩下的就是两个00原创 2015-05-08 22:37:54 · 1532 阅读 · 0 评论 -
UVa10900 - So you want to be a 2n-aire? (期望)
我们不妨设a[i]表示正确做完第i道题的收益的期望,显然我们最后要求的就是a[0]咯,但这个先放一放,我们先讨论一下在做第i+1个题目前我们是选择答题呢还是选择放弃呢。 首先,我们可以直观的想到,如果做完i题就退出的话,就可以得到2^i这么多钱。不妨假设答对第i+1个题的概率为p,那么我们自然会想到用p乘以“某个值”表示答题所获得的收益的期望,如果p乘以这个值大于2^i的话,我们肯定原创 2015-05-08 23:29:04 · 566 阅读 · 0 评论 -
UVa11582 - Colossal Fibonacci Numbers!(模运算)
#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef unsigned long long ULL;const int maxn = 1005;int f[maxn][6*maxn],p[maxn];int原创 2015-04-30 16:37:18 · 1494 阅读 · 0 评论 -
同余与模运算
发现自己还是看书少了,能从书上学到不少东西。加减乘的模运算:#includeusing namespace std;int mul_mod(int a,int b,int n){ a %= n; b %= b; return (int)((long long)a * b % n);}///如果n本身超int,就要用高精度了int add_mod(int a,int原创 2015-04-30 07:35:36 · 1344 阅读 · 3 评论 -
UVa1637 - Double Patience(离散概率)
用九元组表示当前状态,即每队牌剩的张数,状态总数为5^9=1953125.设d[ i ]表示状态i对应的成功概率,则根据全概率公式,d[ i ]为后继成功概率的平均值,按照动态规划的写法计算即可。既然求的是成功的平均概率。 拿 第一行来说 点数可能是 1 2 3 4 5 6 7 1 1. 那么 取走 第一位的1 和倒数第二位1的成功概率为p1 第一位与最后一位为p2 最原创 2015-05-03 09:37:17 · 1166 阅读 · 0 评论 -
UVa11181 - Probability|Given(离散条件概率)
分析:“r个人买了东西”这个时间叫E,"第i个人买东西"这个时间叫Ei,则要求的是条件概率P(Ei|E).根据条件概率公式,P(Ei|E)=P(EiE)/P(E)P(E)依然可用全概率公式,例如,n=4,r=2有6中可能:1100,1010,1001,0110,0101,0011,其中1100的概率为P1*P2*(1-P3)*(1-P4),其他类似,设置A【k】表示第k个人是否买东西,原创 2015-05-03 10:09:38 · 1201 阅读 · 0 评论 -
UVa1636 - Headshot(离散概率)
直接扣一枪没子弹的概率是一个条件概率,等于子串00的个数除以00和01总数(也就是0的个数),转一下再扣没子弹的概率等于0的比率。设子串00的个数为a,0的个数为b,则两个概率分别为a/b和b/n,问题就是比较a*n和b*b。#include#includeconst int maxn=105;char s[105];int cnt0,cnt1,cnt2,cnt3;int mai原创 2015-05-03 10:46:13 · 983 阅读 · 0 评论 -
UVa11440 - Help Tomisu(数论)
题意:给定n和m,求[2,n!]中,所有质因子个数都大于m的个数思路:ϕ(m!)表示小于m!并与m!互质的个数,而与m!互质的个数,他的质因子肯定不包含1-m,因此就是满足条件的。然后对于这题而言,则是要求n!中,不与m!互质的个数,答案取模100000007那么先看一个证明:求kn中与n互质的个数,答案为kϕ(n)。ϕ(n)表示1-n中与n互质的个数,那么由此考虑[n原创 2015-05-11 21:13:45 · 1050 阅读 · 0 评论 -
UVa1363 - Joseph's Problem(数论)
在题目中有三种情况:1、1;2、k == n ;3、k>n;对于第一种情况我们可以分为1到k和k到n两个子问题来解。1.1、1到k: for( i = 1 , sum = 0 ; i 1.2、k到n: sum =(n-k)*k;而对于第二种情况就是第一种情况的(1)。但是就这样写的话时明显的tle的。对于第二种情况也可以分为几个小问题来求解:2.1、原创 2015-05-10 22:07:12 · 962 阅读 · 0 评论 -
UVa10214 - Trees in a Wood.(数论)
只看某一个象限 能看到的数 == 一个 象限*4+4能看到的树既距离原点的距离 gcd(x,y)==1a 和 b 一大一小 预处理2000以内的phi函数,枚举小的一条边从1...a 与 a gcd 为 1 的数的个数就是 phi(a)从 1+a ... 2*a 与 a gcd 为 1 的数的个数 因为 GCD(i,a) = GCD(i+a,a) 所以还是 phi(原创 2015-05-11 22:52:27 · 981 阅读 · 0 评论 -
UVA10288 - Coupons (概率+递推)
公式E(x)=n Σ 1/i因为当已经拿到k张不同的时候 拿到不同牌的期望是 (n-k)/n ,1除于这个概率就是 n/(n-k) 然后从1到n加#include#include#include#include#include#includeusing namespace std;typedef long long ll;ll gcd(ll a,ll原创 2015-05-08 11:24:05 · 1147 阅读 · 0 评论