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 解题报告:定义一种排序算法,每一轮可以随机找一个数,把这个数与后面的比这个数小的交换,一直往后判 ...
随机推荐
- linux mount命令学习
我们在下面这篇博文中已经有笼统的学习了文件系统的一些相关知识, http://blog.csdn.net/boyxulin1986/article/details/12107113 本篇我们主要是用来 ...
- TypeScript 素描 - 装饰器
/* 装饰器 简单理解为C#中的Attribute 可以装饰到类.函数.讯问符.属性.参数上 语法 @xxx 装饰器其实是一个函数 @xxx 就要有一个 function xxx 多个装饰器可以用来装 ...
- JAVA的RSA加密算法工具类
须要用到一个jar http://www.bouncycastle.org/latest_releases.html 须要注意的问题 JS用同一秘钥生成的密文用java解密出来是逆序的,即js加密12 ...
- 命令行修改linux系统IP
修改配置文件/etc/sysconfig/network-scrips/ifcfg-eth0.因为机子启动的时候加载的就是这个文件的配置参数.对这个文件进行修改: [root@localhost ...
- WebMagic的设计参考了业界最优秀的爬虫Scrapy
http://webmagic.io/docs/zh/posts/ch1-overview/thinking.html https://github.com/psvehla/liferay-sprin ...
- Nginx常见502错误
1.配置错误因为nginx找不到php-fpm了,所以报错,一般是fastcgi_pass后面的路径配置错误了,后面可以是socket或者是ip:port2.资源耗尽lnmp架构在处理php时,ngi ...
- jQuery简介以及jQuery选择器
一 简介 1 定义:jQuery库是JavaScript的封装库 2 优点: 1) : 代码开源 2) : 选择器强大 3) : 完善的Ajax 4) : 浏览器兼容性高 5) : 文档完善(帮助文档 ...
- NET下三种缓存机制(Winform里面的缓存使用 )
原文(http://www.cnblogs.com/wuhuacong/p/3526335.html)非常感谢伍华聪作者的分享! 缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度 ...
- 使用 Intel HAXM 为 Android 模拟器加速,媲美真机(转)
源:http://www.cnblogs.com/beginor/archive/2013/01/13/2858228.html 慢的问题. Intel HAXM (Hardware Accelera ...
- IFeatureClass.Search中的 Recycling 参数 - 浅谈.
语法: public IFeatureCursor Search ( IQueryFilter filter, bool Recycling); 当 Recycling 为true时,调用NextFe ...