随笔分类 - OTHEROJ
摘要:给一个集合S,问S有多少个子集满足子集中的数乘积是完全平方组。 一个数是完全平方数当且仅当它所有的质因数都有偶数个,所以只要看这个集合中所有数的质因数是否是偶数个即可。和开灯方案数问题类似,矩阵中X[i][j]=1表示第j个数的第i个质因数(2,3,5,7...)有奇数个,等于0表示有偶数个。然后列出XOR方程组然后算有几个自由基即可。 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 typedef long long LL;
阅读全文
摘要:求从1开始,在一个有向图中经过某条边次数的期望。 E[p]=sigma(E[t]/deg[t]),t为能到p的点的集合,deg[t]为t的度数。对于起点要额外加1,因为第一次肯定会被运行一次。 高斯消元看的Rujia的代码,注意对无解的判断。 1 #include <string.h> 2 #include <stdio.h> 3 #include <vector> 4 #include <math.h> 5 #define MAXN 105 6 using namespace std; 7 const double eps = 1e-9; 8
阅读全文
摘要:给一个数N,每步随机选一个不大于N的质数X,若X整除N,则N=N/X,否则N不变。求N变为1的期望步数。 常规的期望DP,先预处理不大于N的质数个数以及N的质因数,d[n]=p0*d[n]+p1*d[n/d1]+p1*d[n/d2]...+1,其中d1,d2..是n的质因数,p0为选中一个质数不为n的质因数的概率,移项即可得到d[n]的表达式。 1 #include <string.h> 2 #include <stdio.h> 3 #include <vector> 4 #define MAXN 1000005 5 using namespace std;
阅读全文
摘要:一个游戏胜利的概率为p,小明每天晚上都会玩这个游戏直到胜利的比例大于p为止,他就会认为今天胜利了,但每天至多只能玩N次。小明会一直玩这个游戏直到有一天失败为止。求小明玩这个游戏天数的期望。 首先,假设小明每天玩这个游戏胜利的概率为q,根据期望公式有S=∑i*q^i*(1-q)。用数学方法化简可以得到S=1/(1-q),现在问题就转化为求q。 直接用概率论没想出来怎么搞,由于N比较小,可以想到用DP来解,用d[i][j]表示第i天赢了j次并且目前没有获得胜利的概率,有d[i][j]=d[i-1][j-1]*p+d[i-1][j]*(1-p)。 1 #include <stdio.h>
阅读全文
摘要:A在[S1,S2]到达,B在[T1,T2]到达,到达后都会等W分钟,问相遇的概率。 概率论课本上的题目了,列出三个方程s1<=S<=s2,t1<=T<=t2,|T-S|<=w。然后可以转化为几何图形求面积,需要讨论求解。 1 #include <string.h> 2 #include <stdio.h> 3 int cas, t1, t2, s1, s2, w; 4 double area(int w){ 5 int lc = t1+w, rc = t2+w, uc = s2-w, dc = s1-w; 6 if (lc >= s2
阅读全文
摘要:一开始有K只兔子(不知道原题中是什么生物=。=),每只兔子能活一天并有pi的概率生出i只新兔子,求m天后所有兔子死光的概率。 概率递推,设D[m]为m天后兔子全死光的概率,则D[m] = D[m-1]^0*p0+D[m-1]^1*p[1]+...D[m-1]^i*pi.. 1 #include <string.h> 2 #include <math.h> 3 #include <stdio.h> 4 int cas, n, m, k; 5 double p[1005], d[1005]; 6 double dp(int x){ 7 if (x == 0) r
阅读全文
摘要:求树上的每个节点能到达的最远距离。 先预处理出每个节点从叶子上来的最大距离和次大距离,并且记录最大距离是从哪个儿子上来的。 对于每个节点,它能到的最大距离,要不就是走到自己的某个叶子,要不就是走到某个祖先节点然后转弯进入这个祖先的另一个儿子。向下DP,传递不经过这棵子树到该顶点的最大距离。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 #define MAXN 10001 5 #define INF 0x3f3f3f3f 6 using namespace std; 7
阅读全文
摘要:水题。。记录每个节点的孩子个数就可以了。。 1 #include <string.h> 2 #include <stdio.h> 3 #include <vector> 4 #include <algorithm> 5 #define MAXN 16001 6 #define INF 0x3f3f3f3f 7 using namespace std; 8 9 struct egde{10 int v, n;11 }e[MAXN*2];12 int n, tu, tv, ans;13 int first[MAXN], es;14 vector<
阅读全文
摘要:一个n*m的矩形,给出从每个点去它周围的四个点的概率,问从[1,1]走到[n,m]的所花步数期望是多少。 在汤可因的国家集训队论文《浅析竞赛中一类数学期望问题的解决方法》中提到了这个题,对这种带环的模型一般都是高斯消元求解。 假设从某个点走到终点所花步数的期望是d[i,j],很容易推出方程: 这样对每个点列出一个方程,一共n*m个未知数,n*m个方程,用高斯消元即可求解,但是如果直接高斯消元复杂度会达到O(n^3*m^3),所以必然要在基础的高斯消元上加以优化。 下面的这张图片取自题解,是当n=3,m=4时所列出的矩阵,题解中提到了一个block tridiagonal m...
阅读全文
摘要:一个连通的图上有一只猫和老鼠,猫每次能移动一步,会选择到老鼠的最短路去移动,如果有多个选择,移动到标号最小的一个点。如果一步没有抓到老鼠的话,猫可以连续继续移动一步。接着老鼠会随机移动到他附近的一个点或者留在原地,每种移动的概率是1/(该点的度+1)。求猫平均几次可以抓到老鼠。 p[i][j]表示猫在i老鼠在j猫下一步会选择的点,对每个点bfs一遍可以预处理出来。f[i][j]表示猫在i,老鼠在j猫抓到老鼠的期望,则有 f[i,i]=0,p[i,j]==j或者p[p[i,j],j]==j时f[i][j]=1。 1 #include <string.h> 2 #include <
阅读全文
浙公网安备 33010602011771号