hrbust oj 1536 Leonardo's Notebook 置换群问题
题目大意:
给出一个A~Z的置换G,问能否找到一个A~Z的置换G' 能够用来表示为 G = G'*G'
由定理:
任意一个长为 L 的置换的k次幂,都会把自己的每一个循环节分裂成gcd(L, K)份,并且每一份的长度都为L/gcd(L,K)
这里是置换的平方,所以G'长度为偶数的循环节必然会分裂为两个相等的循环节,长度为奇数的循环节还是一个循环节长度不变
那么得到的G中长度为偶数的循环节必然是由G'中偶数的循环节分裂得到,奇数的循环节可以不多做考虑,就认为它是原来的奇数循环节保持不变所得
所以这里只要判断G中数量为偶数的循环节能否做到两两配对即可
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int cnt[] , to[] , vis[];
char str[]; void solve(int u)
{
int ans = , v = u;
while(u != to[v]){
vis[v] = ;
ans++;
v = to[v];
}
vis[v] = ;
cnt[ans]++;
} int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
scanf("%s", str);
//建立映射关系
for(int i= ; i< ; i++){
to[i+] = str[i]-'A'+;
}
memset(cnt , , sizeof(cnt));
memset(vis , , sizeof(vis));
for(int i= ; i<= ; i++){
if(!vis[i]) solve(i);
}
int flag = ;
//遇到任何一个循环节为偶数的不能配对的情况就会输出No
for(int i= ; i<= ; i++){
if(cnt[i] && !(i&)){
if(cnt[i]&){
flag = ;
break;
} }
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return ;
}
hrbust oj 1536 Leonardo's Notebook 置换群问题的更多相关文章
- poj 3128 Leonardo's Notebook (置换群的整幂运算)
题意:给你一个置换P,问是否存在一个置换M,使M^2=P 思路:资料参考 <置换群快速幂运算研究与探讨> https://wenku.baidu.com/view/0bff6b1c6bd9 ...
- POJ 3128 Leonardo's Notebook [置换群]
传送门 题意:26个大写字母的置换$B$,是否存在置换$A$满足$A^2=B$ $A^2$,就是在循环中一下子走两步 容易发现,长度$n$为奇数的循环走两步还是$n$次回到原点 $n$为偶数的话是$\ ...
- [Poj3128]Leonardo's Notebook
[Poj3128]Leonardo's Notebook 标签: 置换 题目链接 题意 给你一个置换\(B\),让你判断是否有一个置换\(A\)使得\(B=A^2\). 题解 置换可以写成循环的形式, ...
- POJ 3128 Leonardo's Notebook (置换)
Leonardo's Notebook Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2324 Accepted: 98 ...
- 【LA 3641】 Leonardo's Notebook (置换群)
[题意] 给出26个大写字母组成 字符串B问是否存在一个置换A使得A^2 = B [分析] 置换前面已经说了,做了这题之后有了更深的了解. 再说说置换群. 首先是群. 置换群的元素是置换,运算时是 ...
- hrbust oj 1526+2028 树状数组
冒泡排序中 如果一个数的后面的某个数和这个数不符合排序规则 那么这个数就会在未来的某次冒泡中与那个数进行交换 这里用到了 树状数组求逆序数的办法来做 需要注意的是2028并不可以改完数组大小后直接套1 ...
- LA 3641 (置换 循环的分解) Leonardo's Notebook
给出一个26个大写字母的置换B,是否存在A2 = B 每个置换可以看做若干个循环的乘积.我们可以把这些循环看成中UVa 10294的项链, 循环中的数就相当于项链中的珠子. A2就相当于将项链旋转了两 ...
- hrbust oj 1025 (计算几何+近似计算)
这是我第一次只要可以这么做,题目中给的精度范围较大,所以可以把圆形的区域直接用小方块拼接近似来表示,maps地图开的越大,精度越高,但同时耗时也更多. 代码如下: #include<cstdio ...
- Leonardo's Notebook UVALive - 3641(置换)
题意: 给出26个大写字母的置换B,问是否存在一个置换A,使得A2 = B 解析: 两个长度为n的相同循环相乘,1.当n为奇数时结果也是一个长度为n的循环:2. 当n为偶数时分裂为两个长度为n/2 ( ...
随机推荐
- bzoj 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机【bfs】
直接bfs即可,注意开double,还有驱动和终点的齿轮都在序列里,要把它们找出来= = #include<iostream> #include<cstdio> #includ ...
- P3297 [SDOI2013]逃考
传送门 完全看不出这思路是怎么来的-- 首先对于两个亲戚,他们监视范围的边界是他们连线的中垂线.那么对于一个亲戚来说它能监视的范围就是所有的中垂线形成的半平面交 然后如果某两个亲戚的监视范围有公共边, ...
- Java中的抽象类详解,它存在的意义在哪里?
学习抽象类前先理解下面这段话: 问你个问题,你知道什么是"东西"吗?什么是"物体"吗? "麻烦你,小王.帮我把那个东西拿过来好吗" 在生活中 ...
- iOS 关于文件操作 NSFileManager
创建文件夹 + (BOOL)creatDir:(NSString *)path { if (path.length==0) { return NO; } NSFileManager *fileMana ...
- [C陷阱和缺陷] 第1章 词法“陷阱”
有感自己的C语言在有些地方存在误区,所以重新仔细把"C陷阱和缺陷"翻出来看看,并写下这篇博客,用于读书总结以及日后方便自身复习. 第1章 词法"陷阱" 1.1 ...
- ElementaryOS 0.4快速配置工具
使用方法: 终端执行 wget http://linux-1251056822.costj.myqcloud.com/elementary_config && bash element ...
- 使用JS分页 <span> beta 1.0
<html> <head> <title>分页</title> <style> #titleDiv{ width:500px; backgr ...
- cloudera-server启动File not found : /usr/sbin/cmf-server解决办法(图文详解)
解决方法 见 cloudera-agent启动File not found : /usr/sbin/cmf-agent解决办法(图文详解) 欢迎大家,加入我的微信公众号:大数据躺过的坑 ...
- [转]TFS下的源代码控制
本文转自:http://www.cnblogs.com/ajiefj/archive/2010/04/23/1718450.html 以下主要描述了: TFS源代码控制系统的基本场景 如何把一个项目添 ...
- SQL数据库基础————委托
委托:也称为代理,事件也是一种委托:定义在类的最外面 1.定义委托关键字:delegate函数签名:签名和函数保持一致定义委托的时候要根据函数来定义public delegate int First( ...