题意

给出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——置换的乘法的更多相关文章

  1. LA 3641 (置换 循环的分解) Leonardo's Notebook

    给出一个26个大写字母的置换B,是否存在A2 = B 每个置换可以看做若干个循环的乘积.我们可以把这些循环看成中UVa 10294的项链, 循环中的数就相当于项链中的珠子. A2就相当于将项链旋转了两 ...

  2. LA 3641 Leonardo的笔记本 & UVA 11077 排列统计

    LA 3641 Leonardo的笔记本 题目 给出26个大写字母的置换B,问是否存在要给置换A,使得 \(A^2 = B\) 分析 将A分解为几个循环,可以观察经过乘积运算得到\(A^2\)后,循环 ...

  3. Leonardo's Notebook UVALive - 3641(置换)

    题意: 给出26个大写字母的置换B,问是否存在一个置换A,使得A2 = B 解析: 两个长度为n的相同循环相乘,1.当n为奇数时结果也是一个长度为n的循环:2. 当n为偶数时分裂为两个长度为n/2 ( ...

  4. 【LA 3641】 Leonardo's Notebook (置换群)

    [题意] 给出26个大写字母组成 字符串B问是否存在一个置换A使得A^2 = B [分析] 置换前面已经说了,做了这题之后有了更深的了解. 再说说置换群.   首先是群. 置换群的元素是置换,运算时是 ...

  5. LA 3510 (置换 循环分解) Pixel Shuffle

    思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用O(n2k)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A分解循环,m则等于所有循环节长 ...

  6. poj 3128 Leonardo&#39;s Notebook(置换的幂)

    http://poj.org/problem?id=3128 大致题意:输入一串含26个大写字母的字符串,能够把它看做一个置换.推断这个置换是否是某个置换的平方. 思路:具体解释可參考url=ihxG ...

  7. poj 3128 Leonardo's Notebook——思路(置换)

    题目:http://poj.org/problem?id=3128 从环的角度考虑. 原来有奇数个点的环,现在点数不变: 原来有偶数个点的环(设有 k 个点),现在变成两个大小为 k/2 的环. 所以 ...

  8. 【LA3461】Leonardo的笔记本

    白书例题. #include<bits/stdc++.h> using namespace std; ],vis[],cnt[]; inline int read(){ ,x=;char ...

  9. POJ 3128 Leonardo's Notebook (置换)

    Leonardo's Notebook Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2324   Accepted: 98 ...

随机推荐

  1. Springboot采用hibernate-validate验证请求参数

    在springboot项目使用hibernate-validate对请求参数添加注解进行校验 常用注解 @Null,标注的属性值必须为空 @NotNull,标注的属性值不能为空 @AssertTrue ...

  2. Windows的socket编程

    ################服务端 1.准备工作导入头文件 #include<WinSock2.h> #pragma comment(lib, "ws2_32.lib&quo ...

  3. Django视图基类

    Django视图基类 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 一 .视图 REST framework 提供 ...

  4. 解决pyspider框架web预览框过小问题

    解决pyspider框架web预览框过小问题 Chrome 使用pyspider框架时,web预览框只有一小条: 解决办法: 找到debug.min.css文件,替换为如下内容: body{margi ...

  5. AGC028E High Elements 贪心、DP、线段树

    传送门 看到要求"字典序最小"的方案,一个很直观的想法是按位贪心,那么我们需要check的就是当某一个数放在了第一个序列之后是否还存在方案. 假设当前两个序列的最大值和前缀最值数量 ...

  6. 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 ...

  7. 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 ...

  8. JAVA基础之Servlet

    个人理解: servlet是用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.需要注意的在创建的服务器端的目录和实际上存在差别的,并且访 ...

  9. Android gradle用exclude排除引用包中的dependency引用

    项目突然编译不通过,报如下错误 FAILURE: Build failed with an exception.         * What went wrong:    Execution fai ...

  10. uboot使用脚本

    使用mkimage命令 # mkimage -A ARM -O linux -T script -C none -n "script" -d *.sh *.img # tftp x ...