[ARC084]F - XorShift 位运算+多项式

题面
首先把一个二进制数ak,ak-1,..,a0看成多项式ak*x^k+ak-1 * x^( k-1) *… *a0,系数再模2意义下计算。
那么该数乘2相当于多项式*x,两个数xor相当于两个多项式相加。
所以我们定义gcd(P,Q)为多项式P和Q的最大公约数,计算方法如下:
设degP>=degQ(若degP< degQ则交换P,Q),deg表示次数,那么令P’=P+Q*(degP-degQ),就把P的最高次项消掉了,然后递归计算gcd(Q,P’),知道某一个为零,另一个多项式即是gcd。
这个gcd满足能用P,Q通过给定操作表示出来的多项式集合都和gcd的倍数多项式集合完全相同。(一个数H是gcd的倍数就是存在一个多项式H’使得H=H’*gcd),感性理解,倍数就相当于好几个gcd错位相加。。。
那么怎么判断一个多项式D是不是gcd的倍数,设一个多项式T初值为0,从最高位开始判端,如果某一位Di!=Ti,那么T就加上一个gcd*x^(i-deggcd),也就是gcd的最高位和Ti对齐,这样就使得Di=Ti,知道判断完deggcd这一位,后面的位都唯一确定了,只需判断0~deggcd-1位T和D相不相同即可。
所以计算<=上界X的gcd的倍数,确定deggcd~degX位上的数就有一个唯一答案,这些位< X的显然有X/x^(deggcd)个,只要判断一下这些位=X时后面的位是否<=X即可࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值