POJ 3744
摘要:题意:人从1开始走,p的概率走1步,1-p的概率走2步,求踩雷的概率。题解:走到第i位置的概率为f[i]=p*f[i-1]+(1-p)*(f[i-2]),利用矩阵快速幂可迅速求出f[i]。考虑成功通过第i个的雷的概率,应该等于没有踩中前(i-1)个雷的概率乘以没有踩中i的概率,而如果没有踩到i-1这颗雷,人必定是从mine[i-1]+1过来的,于是又变成和原来一样的解情况。考虑从1出发顺利通过位于x处的雷的概率,就应该等于一减去踩到x这个位置的概率,而踩到x的概率应该等于f[x],于是,得解。View Code 1 #include<cstdio> 2 #include<cs
阅读全文
POJ 2748
摘要:题意:给n个圆柱作为底,往上面放圆柱,要求每一层上面的一定比这层的圆柱数少,另外,放的位置不同也要算新的一种,问总共有多少种。题解:通过暴力打表可以看出,要求的g(n)就等于f(2*n-1),其中,f(i)是斐波拉契数列第i项,其次,这题坑爹的有100万组样例,log(n)直接求都会超时。所以,只能先找循环节,随便写个暴力程序求出循环节75000,然后就顺理成章了。View Code 1 #include<cstring> 2 #include<cstdio> 3 #include<set> 4 #include<algorithm> 5 usi
阅读全文
POJ 2926
摘要:题意:求n个五维向量的曼哈顿距离。题解:设点i的坐标为(Xi,Yi,Zi,Wi,Ti),那么它与j的曼哈顿距离为|Xi-Xj|+|Yi-Yj|+|Zi-Zj|+|Wi-Wj|+|Ti-Tj|,去掉绝对值后,可能要取反或者不取,可以看出,若把所有情况全部考虑,答案结果有2^5种,但是由于本来是有绝对值的,可能某个本来是正数的值取了反,某个负数有没有取,但这样肯定只能使原数变小,所以我们要的结果实际上是2^5中最大的那个。 去掉绝对值后,原始变为?(Xi-Xj)+?(Yi-Yj)+?(Zi-Zj)+?(Wi-Wj)+?(Ti-Tj),问号即为需要枚举的那个,但如果这样直接去算,会是2^5*n...
阅读全文
POJ 2657
摘要:题意:有长度为n的环,环上有m个坏点,目标在z位置,从1出发,每次跳k步,最后到达z,问最小的k是多少。题解:1、暴力枚举,我没试过,但有人这样过了。 2、考虑目标z,假设跳了m圈,最后跳到z,则有(z-1+m*n)≡0 (mod k),如果(z-1)%k==0,直接检验小于z的坏点是否会猜到,否则,m*n≡(z-1)%k (mod k),用模线性方程可以求出m,考虑坏点,分为两类,一类坏点的坐标小于z,人会从上面跨过m+1次,另一类坏点坐标大于z,人会从上面跨过m次。 对于任意一个坏点a,如果在某一次踩在了它上面,就存在(a-1)*(a-1+n)*(a-1+2*n)*(a-1+3...
阅读全文
POJ 3705
摘要:题意:通过复制粘贴将正序序列变成逆序序列,要求步骤最少。题解:分奇偶讨论,若是奇数,则反复的将最大的那数前面的偶数个数的中间两个挪到后面相应位置,如n=71 2 3 4 5 6 71 2 5 6 7 3 41 6 7 3 2 5 47 3 2 1 6 5 4这样做可以使得每次移动都形成两个降序序列。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int n; 8 while(scan
阅读全文
POJ 1675
摘要:题意:给一个蛋糕,然后三个草莓,要求将蛋糕均分为三份(120度的扇形),不切割草莓并且保证每份蛋糕均有一个草莓,是否可行。题解:三种情况不可行:1、草莓在蛋糕圆心(被这坑了)。 2、存在两草莓与圆心三点共线。 3、三个草莓张角小于120度。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const double PI=acos(-1.0),eps=1e-8; 7 inl
阅读全文
POJ 3716
摘要:题意:给4个骰子,每面染有红色或者蓝色,概率相等,然后告诉你前两次扔后红色面朝上的骰子各有几个,问你再扔一次红色面朝上概率是多大题解:对于推不出公式的童鞋就只好爆搜了,但是,条件概率公式还是要知道才行,即P(A|B)=P(B|A)*P(A)/P(B),通过这个,单独看每一个骰子,可以求出当掷出骰子状态为00,01,10,11时骰子6面为t时的概率。 接着,就是4^4枚举每个骰子状态*7^4枚举每个骰子染色状况*2^4计算期望,然后,还100MS+给过了View Code 1 #include<cstdio> 2 #include<cstring> 3 #include&
阅读全文
POJ 3275
摘要:题意:将n头牛产奶速度又快到慢排序,已经比较了m对牛,问还至少需要多少次比较。题解:n头牛如果排序完成,应该有C(n,2)关系已知,即任意两头牛的速度都知道了。然后可以从已经比较了的m对牛中算出可以推导出多少对牛已经知道了,推导方法可以参考floyd最短路,然后用C(n,2)减去它就是答案。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int head[2][1005],nc[2]; 6 struct Edge 7
阅读全文
POJ 3226
摘要:题意:给定长度,然后从26个字母中选择n个来组成一个长为n的字符串,按照字典序标号为0,1,2.......,然后题目会给你字符串,求这个字符串的标号题解:从m个字母中选择k个组成序列的放法数位P(m,k),从左往右依次填充,进行到第i个字母时,字典序小于该字母的元素还有cnt个,则说明它前面还有cnt个P(m,k),然后扫一遍出答案,由于n<=26,所以要高精度。View Code 1 import java.util.*; 2 import java.math.*; 3 class Main 4 { 5 public static void main(String arg[]) ..
阅读全文
POJ 2668
摘要:将原来所有的的i按照d/i上取整=k的划分为各个区间[next,now),这区间里的ans值就等于(now-next)*k初始now=n+1,k=1,然后每次next就等于d/i,k依次递增,实际上,不是每一个k的next和now所指代的区间都有意义,即next<now,所以,每当遇到一个这种没有意义的next和now时,就通过d/(now-1)上取整找到新的k,这样就可以大大节省时间。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<alg
阅读全文
POJ 2960
摘要:利用SG函数特性,和的SG函数等于单独SG函数的异或,然后对预处理SG函数View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int sg[10005]; 6 bool mark[10005][105]; 7 int s[105]; 8 int main() 9 {10 int m;11 while(scanf("%d",&m)&&m)12 {13 memset(mark,fa
阅读全文
POJ 2976
摘要:算是一道裸的0-1分数规划,0-1规划正确性的证明请参考OI论文《最小割模型在信息学竞赛中的应用》,里面非常详细。总之,就是枚举比例,求a-bx的最大值,由于最多可以删去k个物品,实际就是保留n-k个,然后就在n个物品中选出最大的n-k个物品,然后再看剩下的物品里面权值为正就加进来,最后,看ans是否等于0View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 double a[1005],b[1005]; 6 const
阅读全文
POJ 2154
摘要:由Polya定理可得到最后结果等于1/N*∑N^gcd(i,n);可是,N≤10^9,枚举i明显会超时,但gcd(i,n)最后得到的结果很少,最多1000多个,于是反过来枚举gcd(i,n)的值L,L即n的某个约数,那么我们需要找到0~n-1中有多少个数与n的约数是L,由扩展欧几里得可以知道,必然存在x,y使得i*x+n*y=L,由于L是i,n最大公约数,所以可以变成(i/L)*x+(n/L)*y=1,同时mod(n/L),(i/L)*x≡1(mod n/L),即,要找与n/L互质的i/L有多少个,变成欧拉函数了!于是,最后答案就变成了∑φ(n/L)*N^(L-1),dfs+快速幂取模搞定#i
阅读全文
POJ 3286
摘要:可以用数学方法去递归,也可以用DP。最后情况是:数学:30行代码,94MS;DP:69行代码,63MS;数学递归cpp:#include<cstring>#include<cstdio>using namespace std;void cac(long long con,long long &cnt,long long t){ if(con<=0) return; long long x,y,n=con/10; long long i,j; x=con/10,y=con%10; for(;x!=0;x/=10) if(x%10==0) cnt+=(y+1)
阅读全文