hdu5080:几何+polya计数(鞍山区域赛K题)
/*
鞍山区域赛的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题)的更多相关文章
- hdu5072 Coprime (2014鞍山区域赛C题)(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5072 题意:给出N个数,求有多少个三元组,满足三个数全部两两互质或全部两两不互质. 题解: http://dty ...
- hdu 4463 有一条边必须加上 (2012杭州区域赛K题)
耐克店 和 苹果店必须相连 Sample Input42 30 01 00 -1 1 -10 Sample Output3.41 # include <iostream> # includ ...
- UVALive 7148 LRIP 14年上海区域赛K题 树分治
题意 n个点组成一棵树, 带有点权. 求最长不降的路径的长度, 且路径上最大值最小值之差不超过D. 显然是树分治, 但是分治之后如何维护答案呢. 假设当前重心为g, 分别记录g出发不降路径的长度,以及 ...
- 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 ...
- 2018南京区域赛K题 Kangaroo Puzzle——随机&&乱搞
题意 在 n * m 的平面上有若干个袋鼠和墙(1为袋鼠,0为墙),每次可以把所有袋鼠整体往一个方向移动一步(不能走出边界和不能走到墙),为在不超过50000步的情况下能否把全部袋鼠聚集在同一个位置. ...
- HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~
F - Almost Sorted Array Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- HDU 4438 Hunters 区域赛水题
本文转载于 http://blog.csdn.net/major_zhang/article/details/52197538 2012天津区域赛最水之题: 题意容易读懂,然后就是分情况求出A得分的数 ...
- 2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)
#include<bits/stdc++.h>using namespace std;const long long mod = 998244353;typedef const long ...
- HDU 5122 K.Bro Sorting(2014北京区域赛现场赛K题 模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5122 解题报告:定义一种排序算法,每一轮可以随机找一个数,把这个数与后面的比这个数小的交换,一直往后判 ...
随机推荐
- StoryBoard 设置TabBar SelectImage 和tintColor
如图:StoryBoard 结构是 Tabbar + Navi + ViewController 需求:需要修改TabBar的Image 和SelectImage 设置Image 设置SelectIm ...
- SEO名词_黒帽SEO
一.什么是黒帽SEO 黑帽SEO是指通过一些操控和欺骗找寻搜索引擎漏洞的一些技术,让关键词排名在很短的时间获得非常好的排名的一项技术 二.黒帽SEO的危害 如果被搜索引擎识别网站采用的是黑帽SEO手段 ...
- #python-dateutil下载地址
http://www.lfd.uci.edu/~gohlke/pythonlibs/#python-dateutil
- 魅蓝Note2跑分 MT6753性能究竟如何
MT6753实力究竟如何? 采用LP工艺的MT6753实际上在性能和功耗方面并不比MT6752高,相反,同频下功耗要高1/3左右.并且其内存带宽是5.3G/s,小于MT 6752的6.4G/s 而且没 ...
- Apache+Subversion+TortoiseSVN
Key words: dav_svn, apache, subversion, tortoisesvn # install apache2 sudo apt-get install libapache ...
- Mysql数据库里面的String类型依照数字来排序以及按时间排序的sql语句
今天做项目的时候,遇到个小小的问题,在数据库中查询的时候,要用String类型的ID进行一下排序!(注:ID字段为 varchar 类型) 解决的方法: 如: SELECT * FROM Stude ...
- Java基础知识强化68:基本类型包装类之Character概述和Character常见方法
1. Character概述: public final class Character extends Object implements Serializable,Comparable<Ch ...
- Java基础知识强化37:StringBuffer类之StringBuffer的构造方法
1. StringBuffer的构造方法: (1)StringBuffer(): (2)StringBuffer(CharSequence seq): (3)StringBuffer(int capa ...
- ubuntu14.04 install flow.
打开虚拟机,点击菜单上的“文件”,选择新建虚拟机,如下图所示: 注释:这里选择自定义安装,点击下一步. 这里我的虚拟机版本最新是10的,就选最新的,然后点击下一步,如下图: 这里选择要安装的Ubunt ...
- Sqlserver2012数据库乱码的解决方法
Sqlserver2012数据库乱码的解决方法 1. 在创建数据库时,一定要指定数据库的排序规则 2. 输入数据库名称 3. 选中选项,在排序规则中选中Chinese_P ...