今天的题较水。
T1:带边权的并查集,不过要注意合并时的边权复制,假设要把x与y合并,x的祖先为x1,y的祖先为y1,则x1到他的父亲(y1)的边权为-sx+sy+l,sx为x到x1的边权和,sy为y到y1的边权和,l为x到y的距离。这个画个图就很清楚了。
T2:拓展gcd。
从小到大枚举m,然后枚举i,j。若这个m是不合法的,那么必有c[i]+p[i]*x=c[j]+p[j]*x(mod m)且0<x<=min(l[i],l[j])。
所以有c[i]+p[i]*x=c[j]+p[j]*x-my
∴(p[i]-p[j])*x+my=c[j]-c[i]
令a=(p[i]-p[j]),b=m,c=c[j]-c[i],这边是求一个ax+by=c的不定方程的整数解。这要用到拓展gcd。
下面写一写拓展gcd怎样求。
首先若这个方程有整数解,那么必有gcd(a,b)|c。接着我们把a、b、c都除以gcd(a,b)。注意:这里a有可能小于0,所以gcd(a,b)也有可能小于0。但是我们要令b大于0,所以若除出来的b小于0,我们要把整条式子乘-1。
接着,我们开始解方程。若有ax+by=c和bx'+(a%b)y'=c
那么bx'+(a-(a/b)*b)y'=c((a/b)表示a除以b下取整)
∴bx'+ay'-(a/b)y'b=c
∴ay'+b[x'-(a/b)y]=c
又∵ax+by=c
∴x=y',y=x'-(a/b)y'
这样递归下去,当递归到b=0时,我们便令此时的x=c/a,y=0,然后会带。这样我们便可以用类似gcd的递归过程来求出x和y。
接下来我们要保证x大于0且最小。这个简单,先让x模b,若x大于0,那么这个x就是最小的了;若x小于0,那么就再加一个b。这样就可以判断m是否合法了。
T3:dp。
设f[i][j]表示前i个奇质因子选了j个的独立数的和。
那么转移方程显然。
ans1就等于sum(f[k][j])(j%2=0),ans2=sum(f[k][j])(j%2=1)。
关键是求ans3。有一个结论就是ans1+ans2+ans3=m-1。
证明如下:
我们把1/m,2/m...m/m这m个分数排成一列,然后把他们化简成最简分数形式。
对于每一个x/p,p是m的因数,又因为把1...m/m都取遍了,所以x/p的个数就是phi(p)(x与p互质)。
而p又能取遍m的所有因数,所以m=sum(phi(p))(p为m的因数),所以就有上述结论了。