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 解题报告:定义一种排序算法,每一轮可以随机找一个数,把这个数与后面的比这个数小的交换,一直往后判 ...
随机推荐
- java 自制类加载器的简单实现
package com.xiaomo.reflex; import java.io.File; import java.io.FileInputStream; import java.io.IOExc ...
- 修改cmd的字体
通常打开的cmd默认的字体比较小,字体只有宋体和新宋体两种,如果要修改,需要通过修改注册表才行. 打开regedit后,找到如下路径HKEY_LOCAL_MACHINE\SOFTWARE\Micros ...
- [原创作品]观察者模式在Web App的应用
(转载请注明:http://zhutty.cnblogs.com, 交流请加群:164858883) 在软件工程中,有一条重要的原则就是:高内聚低耦合.这是评定软件的设计好坏的一个标准.所谓高内聚,指 ...
- php增删改查,自己写的demo
1.链接数据库通用方法:conn.php <?php //第一步:链接数据库 $conn=@mysql_connect("localhost:3306","root ...
- iptables简述
一.linux防火墙基础防火墙分为硬件防火墙和软件防火墙. 1.概述linux 防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙. 包过滤机制:ne ...
- sql server 系统表系统视图 及作用说明
sql server 系统视图,可分为: 目录视图 兼容性视图 动态管理视图和函数 信息架构视图 复制视图 系统表: sysaltfiles主数据库 保存数据库的文件 sysch ...
- VCS仿真查看coverage
VCS仿真查看coverage Design compiler & simulate #!/bin/csh -f setenv NOVAS_HOME /EDASynopsys/verdi3-I ...
- 关于一个下载的源代码中的”*.vssscc“文件的问题
今天下载了一份程序的源代码,老是提示我要连接源代码管理服务器,这个……你的账号密码我怎么知道,有木有.于是上网搜罗了一番找来了解决方案,在这里分享给可能出现同样问题的童鞋. 首先说明一下什么是vsss ...
- django: db - admin
本讲演示简单使用 Django Admin 功能. 一,修改 settings.py,添加 admin 应用: INSTALLED_APPS = ( 'django.contrib.auth', 'd ...
- 关于动态SQL中的NULL
declare v_sql ); v_c1 number; v_c2 number; begin v_c2 :; v_sql := 'begin '; v_sql := v_sql||'update ...