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 解题报告:定义一种排序算法,每一轮可以随机找一个数,把这个数与后面的比这个数小的交换,一直往后判 ...
随机推荐
- 关于使用axis调用webservice接口方法
1.概述: 我们有时候会调用webserviec接口,我们向接口发送请求参数,从接口接收返回值. 2.形式: package client; import org.apache.axis.client ...
- 【iOS基础】NSURLConnection
一.大文件下载1.方案:利用NSURLConnection和它的代理方法1> 发送一个请求 // 1.URL NSURL *url = [NSURL URLWithString:@"h ...
- Linux安装mysql源码
1.假设已经有mysql-5.5.10.tar.gz以及cmake-2.8.4.tar.gz两个源文件 (1)先安装cmake(mysql5.5以后是通过cmake来编译的) [root@ rhel5 ...
- 应用按home键无最近应用
在应用的AndroidManifest里面添加加载模式
- 五、SolrJ、Request Handler
什么是SolrJ 既然Solr是以单独的WebApp形式存在的,那么Solr理应提供与Solr通信的Api吧,对的,这就是SolrJ,既然与solr通信是通过url,那么其实我们也可以不用SolrJ, ...
- Linux文件的查找
一直以来,总是记不住文件的查找命令,今天记在博客里,希望可以记得更牢! 1.脚本文件名的查询 which命令(寻找执行文件) #which ifconfig 2.文件名的查找 whereis 命令 # ...
- scrollTop,scrollLeft
document.body.scrollTop用法 网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可 ...
- sqlserver中的序列
序列是由用户定义的绑定到架构的对象.序列依据定义的间隔按升序或降序生成,并可配置为用尽时重新启动(循环).序列不与特定表关联.序列与表之间的关系由应用程序进行控制. 创建序列的语法: CREATE S ...
- 新Android学习计划
最近,在学习Android Design Support Library提供的新控件过程中,我感受到了原来的学习方式的缺点: 学习内容过于随意,在工作过程中碰到的新问题都想去掌握,心血来潮就想写一篇相 ...
- 教训 Mac下装windows系统 失败后 磁盘空间丢失
本来Mac上装的是win10 最近老提示快过期了 想到月底就要停止免费更新了 决定装一下win8 然后升级到win10 因为之前有过装win10的经验 所以很轻松 进入Mac 先到bootcamp 取 ...