这个题目就是解线性同余方程,(a + nc) % 2的k次 = b % 2的k次。既然以前是学信安的,对数论本来就不排斥,最近还好好看了下算法导论。这个方程转换为nc = (b-a) % 2的k次。根据数论的知识, ax = b%n,需要保证gcd(a,n)|b,意思b是gcd(a,n)的倍数,这个一下子也很难解释清楚啊,不满足这个条件,就是没解了。还有,如果有解的话,解的个数就是d = gcd(a,n)。而且其中一个解是x0 = x’(b/ d),其中x’是用扩展欧几里德算法求出来的,满足关系式ax’+ny’=d。
但是这个题不仅仅用到数论的这些知识,因为必须求满足条件的最小解,而如果有解的话是d个,而且满足解x = x0 + i(b/d),(1<=i<=d)。既然要求最小的解,那么对解mod(n/d)即可了,因为它们之间的差都是n/d的倍数。
代码如下:
1 | #include <stdio.h> |