HDU 5080 polya定理

该博客分析了一个基于Polya定理的ACM竞赛题目HDU 5080。由于坐标仅限整数,玩具可能按照90度、180度或不转动进行排列。博主通过暴力枚举法确定旋转角度,并利用Polya定理计算不同等价类的方案数。文章包含验证旋转点的方法和应用Polya定理的提示,提供了相关的AC代码参考。
摘要由CSDN通过智能技术生成

分析: 因为坐标只有整数,所以只能是转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 &&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值