2018.07.09【2018提高组】模拟B组(拓展gcd)

今天的题较水。

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的因数),所以就有上述结论了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值