随
给出n个正整数a1,a2…an和一个质数mod.一个变量x初始为1.进行m次操作.每次在n个数中随机选一个ai,然后x=x*ai%mod.问m次操作之后x的取值的期望.
答案一定可以表示成a/b的精确分数形式.a和b可能很大,所以只需要输出a*(b^(10^9+5))模10^9+7的结果.
n<=10^5 m<=10^9 mod<=10^3 1<=ai<mod
solution
考试时明白了原根是什么,只可惜我就是脑子抽风,不会dp...
80分:
定义 f[i][j] 表示乘到第i次,x=j的概率 (当然概率是%1e9意义下的概率)
由于m很大,而状态转移可以写成矩阵乘的形式,所以可以用矩阵乘法优化到O(mod^3*logm)
100分:
O(n^2)求出mod的原根(原根rt:rt的1次方,2次方,...,mod-1次方可以取到1~mod-1的所有数)
所有的ai都可以用rt^k表示
所以这时 f[i][j] 表示乘到第i次,rt^j的概率,然后矩阵乘把状态矩阵输出,发现是循环矩阵
之后就优化到了O(n^2*logm)
单
给一个n个点的树,有n-1条边,每一个点有一个权值,定义a[i]为i这个点的权值,定义dis(i,j)为i到j的树上距离,dis(i,i)=0
定义b[i]=∑a[j]*dis(i,j)
有两种情况:
1.给定a[i],求出b[i]
2.给定b[i],求出a[i]
solution
对于树上的一对fa和son,我们发现b[fa]和b[son]的差别只是由于他俩之间的边做出贡献
定义 sum为整棵树的取值之和 pre[i]=sum-val[i](以i为根的子树权值和) suf[i]=val[i]
而 pre[i]和suf[i] 都是可以通过一遍O(n)的dfs求出
那么得到n-1个关系 b[fa]-b[son]=-pre[fa]+suf[son]
第一种情况:
由b[fa]可以推到b[son] 即
b[son]=b[fa]+pre[fa]-suf[fa]
所以先dfs一遍求出b[root]
再递推即可
第二种情况:
b[fa]-b[son]=-pre[fa]+suf[son]+ sum=pre[fa]+suf[son]
↓
b[fa]-b[son]=2*suf[son]-sum
把n-1个关系相加得
temp=2*(∑suf[k](1<=k<=n,k!=root))-(n-1)*sum的值
得到的n-1个关系 只是a[i]之间的关系,与它们的具体取值无关
而 b[root]=∑suf[k](1<=k<=n,k!=root)
(temp+b[root]*2)/(n-1)=sum
求出来sum再回代即可求出suf[i],最后差分求出a[i]
题
你在平面直角坐标系上.
你一开始位于(0,0).
每次可以在上/下/左/右四个方向中选一个走一步.
即:从(x,y)走到(x,y+1),(x,y-1),(x-1,y),(x+1,y)四个位置中的其中一个.
允许你走的步数已经确定为n.现在你想走n步之后回到(0,0).但这太简单了.你希望知道有多少种不同的方案能够使你在n步之后回到(0,0).当且仅当两种方案至少有一步走的方向不同,这两种方案被认为是不同的.
答案可能很大所以只需要输出答案对10^9+7取模后的结果.(10^9+7=1000000007,1和7之间有8个0)
这还是太简单了,所以你给能够到达的格点加上了一些限制.一共有三种限制,加上没有限制的情况,一共有四种情况,用0,1,2,3标号:
0.没有任何限制,可以到达坐标系上所有的点,即能到达的点集为{(x,y)|x,y为整数}
1.只允许到达x轴非负半轴上的点.即能到达的点集为{(x,y)|x为非负数,y=0}
2.只允许到达坐标轴上的点.即能到达的点集为{(x,y)|x=0或y=0}
3.只允许到达x轴非负半轴上的点,y轴非负半轴上的点以及第1象限的点.即能到达的点集为{(x,y)|x>=0,y>=0}
typ=2,n<=1000 typ=3,n<=100000 typ=1,n<=100000 typ=0,n<=100000
solution
tpy=