Leonardo的笔记本LA 3641——置换的乘法
题意
给出26个大写字母的置换 $B$,问是否存在一个置换 $A$,使得 $A^2=B$.
分析
首先,若A=BC,若B和C都能表示成两个相同循环的乘积,则A也能。
因为,不相交的循环的乘积满足交换律和结合律,
设 $B=(b_1\ b_2 \ b_3)^2, C=(c_1 \ c_2 \ c_3 \ c_4)^2$,则 $A^2 = (b_1\ b_2 \ b_3)^2 \times (c_1 \ c_2 \ c_3 \ c_4)^2 = ((b_1\ b_2 \ b_3) \times (c_1 \ c_2 \ c_3 \ c_4))^2$.
其次,考察两个相同循环的乘积,
$$(a_1 \ a_2 \ a_3)(a_1 \ a_2 \ a_3) = (a_1 \ a_3 \ a_2)\\
(b_1 \ b_2\ b_3\ b_4)(b_1 \ b_2\ b_3\ b_4) = (b_1 \ b_3)(b_2 \ b_4)$$
不难总结出规律:当 $n$ 为奇数时结果也是一个长度为 $n$ 的循环;当 $n$ 为偶数时分裂成两个长度为 $n/2$ 的循环。
反过来,偶数长的循环需要两两配对,奇数长的不用管。
#include<bits//stdc++.h>
using namespace std; char B[];
int vis[], cnt[]; int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", B);
memset(vis, , sizeof(vis));
memset(cnt, , sizeof(cnt));
for(int i = ;i < ;i++)
{
if(!vis[i]) //找到一个从i开始的循环
{
int j = i, tmp = ;
do {
vis[j] = ;
j = B[j] - 'A';
tmp++;
}while(i != j);
cnt[tmp]++;
}
}
bool flag = true;
for(int i = ;i <= ;i += ) //只管偶数长度的即可
if(cnt[i] % ) flag = false; if(flag) printf("Yes\n");
else printf("No\n");
}
return ;
}
Leonardo的笔记本LA 3641——置换的乘法的更多相关文章
- LA 3641 (置换 循环的分解) Leonardo's Notebook
给出一个26个大写字母的置换B,是否存在A2 = B 每个置换可以看做若干个循环的乘积.我们可以把这些循环看成中UVa 10294的项链, 循环中的数就相当于项链中的珠子. A2就相当于将项链旋转了两 ...
- LA 3641 Leonardo的笔记本 & UVA 11077 排列统计
LA 3641 Leonardo的笔记本 题目 给出26个大写字母的置换B,问是否存在要给置换A,使得 \(A^2 = B\) 分析 将A分解为几个循环,可以观察经过乘积运算得到\(A^2\)后,循环 ...
- Leonardo's Notebook UVALive - 3641(置换)
题意: 给出26个大写字母的置换B,问是否存在一个置换A,使得A2 = B 解析: 两个长度为n的相同循环相乘,1.当n为奇数时结果也是一个长度为n的循环:2. 当n为偶数时分裂为两个长度为n/2 ( ...
- 【LA 3641】 Leonardo's Notebook (置换群)
[题意] 给出26个大写字母组成 字符串B问是否存在一个置换A使得A^2 = B [分析] 置换前面已经说了,做了这题之后有了更深的了解. 再说说置换群. 首先是群. 置换群的元素是置换,运算时是 ...
- LA 3510 (置换 循环分解) Pixel Shuffle
思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用O(n2k)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A分解循环,m则等于所有循环节长 ...
- poj 3128 Leonardo's Notebook(置换的幂)
http://poj.org/problem?id=3128 大致题意:输入一串含26个大写字母的字符串,能够把它看做一个置换.推断这个置换是否是某个置换的平方. 思路:具体解释可參考url=ihxG ...
- poj 3128 Leonardo's Notebook——思路(置换)
题目:http://poj.org/problem?id=3128 从环的角度考虑. 原来有奇数个点的环,现在点数不变: 原来有偶数个点的环(设有 k 个点),现在变成两个大小为 k/2 的环. 所以 ...
- 【LA3461】Leonardo的笔记本
白书例题. #include<bits/stdc++.h> using namespace std; ],vis[],cnt[]; inline int read(){ ,x=;char ...
- POJ 3128 Leonardo's Notebook (置换)
Leonardo's Notebook Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2324 Accepted: 98 ...
随机推荐
- Springboot采用hibernate-validate验证请求参数
在springboot项目使用hibernate-validate对请求参数添加注解进行校验 常用注解 @Null,标注的属性值必须为空 @NotNull,标注的属性值不能为空 @AssertTrue ...
- Windows的socket编程
################服务端 1.准备工作导入头文件 #include<WinSock2.h> #pragma comment(lib, "ws2_32.lib&quo ...
- Django视图基类
Django视图基类 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 一 .视图 REST framework 提供 ...
- 解决pyspider框架web预览框过小问题
解决pyspider框架web预览框过小问题 Chrome 使用pyspider框架时,web预览框只有一小条: 解决办法: 找到debug.min.css文件,替换为如下内容: body{margi ...
- AGC028E High Elements 贪心、DP、线段树
传送门 看到要求"字典序最小"的方案,一个很直观的想法是按位贪心,那么我们需要check的就是当某一个数放在了第一个序列之后是否还存在方案. 假设当前两个序列的最大值和前缀最值数量 ...
- fatal:'origin' does not appear to be a git repository fatal:Could not read from remote repository
天gitlab中遇到的问题: 当 git push origin branch_name时遇到报错如下: fatal:'origin' does not appear to be a git repo ...
- python day 9: xlm模块,configparser模块,shutil模块,subprocess模块,logging模块,迭代器与生成器,反射
目录 python day 9 1. xml模块 1.1 初识xml 1.2 遍历xml文档的指定节点 1.3 通过python手工创建xml文档 1.4 创建节点的两种方式 1.5 总结 2. co ...
- JAVA基础之Servlet
个人理解: servlet是用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.需要注意的在创建的服务器端的目录和实际上存在差别的,并且访 ...
- Android gradle用exclude排除引用包中的dependency引用
项目突然编译不通过,报如下错误 FAILURE: Build failed with an exception. * What went wrong: Execution fai ...
- uboot使用脚本
使用mkimage命令 # mkimage -A ARM -O linux -T script -C none -n "script" -d *.sh *.img # tftp x ...