分析: 因为坐标只有整数,所以只能是转90度 或者180 或者 不转。
根据polya定理,我们可以求出所有的方案数, 前提是证明出这个玩具是每转90度相同的还是180度还是不转。
如何证明这个玩具转的角度。我用了暴力枚举的方法,因为n<=50,O(n^4)算法足够了,是这样的,枚举任意两个点的中点。
如果这个中点是所有点对的中点,那么这个中点就是旋转点。然后每次逆时针旋转90度,看和原来的边和点是否匹配。
然后根据旋转的角度来计算等价类的个数,具体如何计算等价类,请百度polya定理。参考AC代码:
#include<cstdio>
typedef long long LL;
const int MOD = 1000000007;
struct Point{
double x,y;
Point(double x=0, double y=0){this->x=x;this->y=y;}
}p[55],p1[55];
bool operator==(const Point &a, const Point &b){
return a.x == b.x && a.y == b.y;
}
struct Line{
Point a,b;
}l[1555],l1[1555];
bool operator==(const Line &l1, const Line &l2){
return l1.a == l2.a &&