【数论】莫比乌斯函数+中国剩余定理

 恰好在周二仔细看了中国剩余定理。。可惜还是没能在比赛的时候做出来。。。:-(

codeforce 2018-2019icpc final C 

题目大意是:给一个长度为200的01串,代表的是在[1,1e9]范围内连续200个数的莫比乌斯函数值,求出是否真的是存在这么样子的200个值,不存在输出-1,存在则输出这个长度为200的区间的最小起始位置。

我的思路是:

因为 |μ( )| 在 存在某个质数2次幂以上的因子时为0 ,然后 又有这么一个结论:x在区间[a,a+x]必出现一次它的倍数。

而,在200以内有质数2次幂的数是:4,9,25,49,121,169 这6个,(只考虑2次幂,因为之后要考虑的是这些数的倍数,而一个数的高次幂一定可以用它的倍数表示 ),

然后,这些数值包括它们的倍数 的μ一定为0,所以当x等于质数^2的倍数时,x每隔x必定为0,可以在[1,200]这个区间的起始区间去check,check是找出可能是{4,9,25,49,121,169}这些数的位置,只要在整个区间内,逢其倍数必为0的数就可能是它的倍数。然后就找出所有可能的结果。

我当时随便想想,然后随便想想又想起了两天前看到的剩余定理,意外眼熟,然后就有了:设这些数为mi,起始位置,也就是ans为x,找到这些数的一组起始位置时,就可以确定一组值,我在这设为di,di=x%mi;

然后 中国剩余定理有:

  对于一组方程: x=di(mod mi) 

  在m1,m2,m3,....,mi,...,mk  两两互质的条件下,设N=m1*m2*m3*....*mi*...*mk ,

  在模N的条件下有唯一解。

然后我就根据这组东西去求这个解,然后再反过来check,看看两组是否一样。

反过来check是因为,那组d的值是根据0确定的但不根据1,所以0符合不一定1符合,可能得到的新值0更多。一开始就因为这个wa了。

然后,会超时。因为,全0的话。。很难搞。

然后我就自己写个随机数打表,在有限样例内发现连续的0不超过6个,且1的个数为118到126个,因此我选择起始check时,连续0超过10个 或者 1的个数不再115到130范围内 直接判为无解。

然后其他按正常做法就行了。

原文地址:https://www.cnblogs.com/kkkek/p/11954874.html