题目大意:在一个圆上有 n 个等距的点以及 m 条(连接这 n 个点的)边。问:这些点和边组成的是否是一个 旋转对称图形,即图上每个点沿顺时针旋转 k(<n) 次后得到的图形和原图形重合。
题解翻译自 官方题解,如下:
让我们暴力枚举 k 并判断将图形顺时针旋转 k 次之后能否得到相同的图形。我们可以通过判断每个线段 (a,b) 是否都存在一个对应的线段 (a+k,b+k)(你需要按需对 n 取模,如果这里指的节点编号超过了 n 的话)。
这给出了一个 O(n⋅m) 的解法,然而,我们只需要去枚举 n 的因数就可以(而不是说把 1 到 n 都枚举一遍)。这是因为 (a,b),(a+k,b+k),(a+2k,b+2k),… 的集合是等价于 (a,b),(a+gcd(n,k),b+gcd(n,k)),(a+2gcd(n,k),b+2gcd(n,k)),… 的集合的。
基于此,时间复杂度可以降为 O(n⋅d(n)),其中 d(n) 表示的是 n 的因子个数,这个时间复杂度足以解决这个问题。
样例1对应的图片:
我没有搞懂的问题是题解中的这句话:
(a,b),(a+k,b+k),(a+2k,b+2k),… 的集合是等价于 (a,b),(a+gcd(n,k),b+gcd(n,k)),(a+2gcd(n,k),b+2gcd(n,k)),… 的集合的。
希望有大佬能够帮助我解答一下这个问题,万分感谢!