/*

鞍山区域赛的K题。。当时比赛都没来得及看(反正看了也不会)

学了polya定理之后就赶紧跑来补这个题。。

由于几何比较烂写了又丑又长的代码,还debug了很久。。

比较感动的是竟然1Y了。。

*/

题目大意:

给定一些点,某些点上有边,问用k种颜色染色的等价类有多少种

思路:

由于坐标是整数。。只有可能旋转90,180,270才能得到置换

且图形必须为中心对称图形

先用几何方法找出对称中心

然后旋转,找是否出现置换。。。

由于点数只有50,几何预处理这一部分可以很暴力无脑的写。。各种判断相等即可

得到置换数和每个置换的循环数之后用polya定理的公式求和即可(取模需要逆元)

代码:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<math.h>
#include<ctype.h>
using namespace std;
#define esp 0.0000000001
#define mod 1000000007
bool isequal(double a,double b)
{
if(fabs(a-b)<esp)
return ;
return ;
}
struct point
{
double x,y;
bool operator ==(point a)
{
return (isequal(x,a.x)&&isequal(y,a.y));
}
void rotate(point o)
{
double y1=y-o.y;
double x1=x-o.x;
x=o.x+y1;
y=o.y-x1;
}
}O,p[],q[];
struct edge
{
int a,b;
bool operator ==(edge t)
{
return ((p[a]==q[t.a]&&p[b]==q[t.b])||(p[b]==q[t.a]&&p[a]==q[t.b]));
}
}e[];
////
int g,r[],n,m,k,rev[]; long long exgcd(long long a,long long b,long long &x,long long &y)
{
if(a==&&b==) return -;
if(b==){x=;y=;return a;}
long long d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
//*********求逆元素*******************
//ax = 1(mod n)
long long inv(long long a,long long n)
{
long long x,y;
long long d=exgcd(a,n,x,y);
if(d==) return (x%n+n)%n;
else return -;
}
long long quickmod(long long a,long long b,long long m) //a^b%m
{
long long res=;
while(b)
{
if(b&)
res=res*a%mod;
b>>=;
a=a*a%mod;
}
return res;
} point mid(point a,point b)
{
point res;
res.x=(a.x+b.x)/;
res.y=(a.y+b.y)/;
return res;
}
point sym(point a,point o)
{
point res;
double x1=o.x-a.x;
double y1=o.y-a.y;
res.x=o.x+x1;
res.y=o.y+y1;
return res;
}
int yes(int i,int j)
{
int ok=;
point tmp;
for(int i=;i<n;i++)
{
tmp=sym(p[i],O);
int j;
for(j=;j<n;j++)
{
if(p[j]==tmp)
{
break;
}
}
if(j==n)
{
ok=;
break;
}
}
return ok;
}
int findo()
{
int ok=;
for(int i=;i<n;i++)
{
for(int j=i+;j<n;j++)
{
O=mid(p[i],p[j]);
if(yes(i,j))
{
ok=;
break;
}
}
if(ok)
break;
}
return ok;
}
int check()
{
int ok=;
for(int i=;i<m;i++)
{
int j;
for(j=;j<m;j++)
{
if(e[j]==e[i])
{
break;
}
}
if(j==m)
{
ok=;
break;
}
}
return ok;
}
int findrev()
{
int ok=;
for(int i=;i<n;i++)
{
int j;
for(j=;j<n;j++)
{
if(p[i]==q[j])
{
r[i]=j;
break;
}
}
if(j==n)
ok=;
if(ok==)
break;
}
return ok;
}
int findloop()
{
int res=;
bool vi[];
memset(vi,,sizeof(vi));
for(int i=;i<n;i++)
{
if(!vi[i])
{
for(int j=i;;j=r[j])
{
vi[j]=;
if(r[j]==i)
{
break;
}
}
res++;
}
}
return res;
}
void reverse()
{
rev[]=n;
g=;
if(!findo())
{
return;
}
memcpy(q,p,sizeof(q));
for(int i=;i<=;i++)
{
for(int j=;j<n;j++)
{
q[j].rotate(O);
}
if(check())
{
if(findrev())
rev[g++]=findloop();
}
}
}
void ini()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for(int i=;i<m;i++)
{
scanf("%d%d",&e[i].a,&e[i].b);
e[i].a--;
e[i].b--;
}
}
void solve()
{
reverse();
long long ans=;
for(int i=;i<g;i++)
{
ans+=quickmod(k,rev[i],mod);
ans%=mod;
}
if(g==)
{
ans*=inv(,mod);
ans%=mod;
ans*=inv(,mod);
ans%=mod;
}
else
{
ans*=inv(g,mod);
ans%=mod;
}
printf("%I64d\n",ans);
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
ini();
solve();
}
return ;
}

hdu5080:几何+polya计数(鞍山区域赛K题)的更多相关文章

  1. hdu5072 Coprime (2014鞍山区域赛C题)(数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出N个数,求有多少个三元组,满足三个数全部两两互质或全部两两不互质. 题解: http://dty ...

  2. hdu 4463 有一条边必须加上 (2012杭州区域赛K题)

    耐克店 和 苹果店必须相连 Sample Input42 30 01 00 -1 1 -10 Sample Output3.41 # include <iostream> # includ ...

  3. UVALive 7148 LRIP 14年上海区域赛K题 树分治

    题意 n个点组成一棵树, 带有点权. 求最长不降的路径的长度, 且路径上最大值最小值之差不超过D. 显然是树分治, 但是分治之后如何维护答案呢. 假设当前重心为g, 分别记录g出发不降路径的长度,以及 ...

  4. ACM学习历程——ZOJ 3829 Known Notation (2014牡丹江区域赛K题)(策略,栈)

    Description Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathema ...

  5. 2018南京区域赛K题 Kangaroo Puzzle——随机&&乱搞

    题意 在 n * m 的平面上有若干个袋鼠和墙(1为袋鼠,0为墙),每次可以把所有袋鼠整体往一个方向移动一步(不能走出边界和不能走到墙),为在不超过50000步的情况下能否把全部袋鼠聚集在同一个位置. ...

  6. HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~

    F - Almost Sorted Array Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  7. HDU 4438 Hunters 区域赛水题

    本文转载于 http://blog.csdn.net/major_zhang/article/details/52197538 2012天津区域赛最水之题: 题意容易读懂,然后就是分情况求出A得分的数 ...

  8. 2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)

    #include<bits/stdc++.h>using namespace std;const long long mod = 998244353;typedef const long ...

  9. HDU 5122 K.Bro Sorting(2014北京区域赛现场赛K题 模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5122 解题报告:定义一种排序算法,每一轮可以随机找一个数,把这个数与后面的比这个数小的交换,一直往后判 ...

随机推荐

  1. Linux安装mysql-python库时报错解决办法

    用pip安装mysql-python库的时候遇到如下报错 root@LoidAir:~# pip install mysql-python Collecting mysql-python Using ...

  2. NuGet 问题及小技巧

    在使用NuGet程序包管理时,经常会遇到的一些小问题.比如,联网搜索时间太长,搜索不到常见或想要的程序包,程序包版本兼容问题,想安装制定的版本等. 那么我们可以使用以下的一些小技巧来解决. 1.检查N ...

  3. Gulp 简单的开发环境搭建

    //获取gulp //require()是 node (CommonJS)中获取模块的语法 var gulp=require('gulp'); //获取gulp-concat模块(用于合并文件):np ...

  4. js解析json,js转换json成map,获取map的key,value

    json串格式 { "10.10.11.1": { "target_1": "34.2", "target_3": &q ...

  5. Nicholas C. Zakas(JS圣经:JavaScript高级程序设计作者)如何面试前端工程师

    Original Post:Interviewing the front-end engineerNicholas C. Zakas,2010年1月5日翻译完成:2010年1月7日,最后更新:2010 ...

  6. Android Studio试用总结

    Android Studio是一年前Google I/O上推出的一款Android开发IDE,他基于JetBrains’ IntelliJ IDEA,目前还在preview阶段.增强了布局拖拽和预览功 ...

  7. C# 还原SQL数据库(非存储过程方式)

    Winform的代码,最好是在数据所在电脑上运行代码,不然会因为权限问题导致失败. 数据库备份: SqlConnection con = new SqlConnection("Data So ...

  8. js中this的指向

    在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧. JS中,this的值取决于调用的模式(调用对象),而JS中共有4种调用模式: 1. ...

  9. pd的django个人博客教程----1:效果展示等

    开发环境同to do list 1:首页:localhost/pd/ 2:导航栏测试或者生活点入: 测试:localhost/category/?cid=1 3:点击文章后进入文章显示页面 e.g:进 ...

  10. taglib的使用

    使用自定义的taglib可以是我们对页面数据的处理放在后台,不仅使用方便,而且影藏了处理逻辑,也更加的安全. 需要使用到servlet.jar 1.在web-inf下建立taglib.tld文件 &l ...