U149791 正多边形变换
原博客网页——洛谷博客
如果您对群论有所了解,那么本题就是对二面体群 \(D_{2n}\) 的简单实现,您可以直接跳到代码部分。下面的解题思路只是对二面体群 \(D_{2n}\) 的构造思路的诠释。
解题思路
(为描述方便,记操作类型为 \(op\) 操作变量为 \(k\) 的操作为 \((op,k)\),连续两次操作记作 \((op,k)*(op',k')\))
对于两次旋转,显然有 \((0,k)*(0,k')=(0,(k+k') \mod n)\) 。
对于旋转再关于 \(x\) 对称,显然有 \((0,k)*(1,0)=(1,k)\)
对于关于 \(x\) 对称再旋转,发现反转后,顶点标号从逆时针转为顺时针(反之亦然),旋转角度即刻反转,即 \((1,0)*(0,k)=(1,n-k)\)
对于操作 \((1,k)\) ,发现 \(k\) 号轴与 \(x\) 轴的夹角为 \(\frac{\pi k}{n}\) ,且关于 \(k\) 号轴对称相当于旋转 \(\frac{\pi k}{n}\) 弧度、关于 \(x\) 轴对称、再旋转 \(-\frac{\pi k}{n}\) 弧度,于是我们得到恒等式:\((1,k)=(0,\frac{k}{2})*(1,0)*(0,-\frac{k}{2})\) (其中的 \(\frac{k}{2}\) 不一定为整数,这是不太严谨的地方,不过强行把操作变量的范围扩展到半整数也未尝不可)。运用这个等式,推出:
- \((0,k)*(1,k')=(1,(k+k') \mod n)\)
- \((1,k)*(0,k')=(1,(k+n-k') \mod n)\)
- \((1,k)*(1,k')=(0,(k+n-k') \mod n)\)
综上:
- \((0,k)*(0,k')=(0,(k+k') \mod n)\)
- \((0,k)*(1,k')=(1,(k+k') \mod n)\)
- \((1,k)*(0,k')=(1,(k+n-k') \mod n)\)
- \((1,k)*(1,k')=(0,(k+n-k') \mod n)\)、
我们可以将正多边形的初始状态记作 \((0,0)\) ,那么代码就是对以上四个式子的实现,时间复杂度 \(O(m)\) 。
代码\(_{_{{\text{(数据就是它造的)}}}}\)
#include<cstdio>
using namespace std;
int main() {
int n, m;
int reflect = 0, rotate = 0;
scanf("%d%d", &n, &m);
while (m--) {
int op, k;
scanf("%d%d", &op, &k);
if (reflect) rotate = (rotate + n - k) % n;
else rotate = (rotate + k) % n;
reflect = (reflect + op) % 2;
}
printf("%d %d", reflect, rotate);
return 0;
}
U149791 正多边形变换的更多相关文章
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- Hilbert-Huang Transform(希尔伯特-黄变换)
在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...
- 【Win 10 应用开发】三维变换
所谓三维变换,其实是在二维平面上产生三维的视觉效果.前面老周简单提了一下透视效果,如果透视效果不能满需求,那可以考虑用三维变换. UIElement类有一个属性叫Transform3D,它定义的类型为 ...
- CSS3之3d变换与关键帧
3d变换是在transform基础上实现的 transform-style:preserve-3d; 建立3d空间 perspective:; 景深(设置用户看的距离) perspective-ori ...
- 纯CSS3实现多层云彩变换飞行动画
查看效果:http://hovertree.com/texiao/css3/4/效果2 效果图: 代码如下: <!doctype html> <html lang="zh& ...
- CSS3之过渡及2D变换
transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形式 ea ...
- 为什么FFT时域补0后,经FFT变换就是频域进行内插?
应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...
- 相机变换与Ray-Casting
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify; orphans: 0; widows ...
- UVA 12300 Smallest Regular Polygon(正多边形)
题意:给出两点,求经过这两点的正n边形的最小面积 题解:这两点一定是最长的弦,我们设正多边形中点c,找到c到每个点的距离(都相同) 我们知道那个等腰三角形的底与每个角度就使用余弦定理 #include ...
随机推荐
- LESS语法学习笔记
LESS 通过编写less文件来快速生成css文件,对css的语法进行了扩展 Less语法 注释 单行注释不会被编译,多行才会被编译 变量 less:定义变量用@ scss:定义变量用$ @num: ...
- 三:.net core(.NET 6)给swagger添加文档注释详细步骤
提供swagger文档注释. 0.先给api加上标题注释和返回值注释: 然后,启动见证奇迹: What the hell?没得注释?查看当前自动生成的swagger代码如下: 首先,我们需要对需要注释 ...
- Django优雅集成MongoDB
Django优雅集成MongoDB 将Django与MongoDB集成 在不更改Django ORM的情况下,将MongoDB用作Django项目的后端数据库.使用Django Admin在Mon ...
- GO语言复合类型02---数组
package main import "fmt" /* 固定长度.固定类型的数据容器 */ /*数组的声明*/ func main031() { //var array [5]i ...
- 用NVIDIA-NGC对BERT进行训练和微调
用NVIDIA-NGC对BERT进行训练和微调 Training and Fine-tuning BERT Using NVIDIA NGC 想象一下一个比人类更能理解语言的人工智能程序.想象一下为定 ...
- Redis系列(三):Bitmaps和HyperLogLog
本篇介绍Bitmaps和HyperLogLog. 一.Bitmaps 计算机中最小的单位是bit(位),很多计算机语言也提供了位操作符,比如Java中就有&.|.>>.>&g ...
- 练习(time.tick定时器监控数据库)
设立个定时器,监控数据库里fb_state(发布状态),并将数据库中一条记录的开始时间与截止时间和当前时间进行比对.若当前时间在开始时间与结束时间之间,则将发布状态设为1,否则为0. 同时,将此段代码 ...
- Effective Fusion Factor in FPN for Tiny Object Detection
微小目标检测的FPN有效融合因子 摘要:基于FPN的检测器在一般物体检测方面取得了显著的进步,例如MS COCO和PASCAL VOC.然而,这些检测器在某些应用场景中会失败,例如微小物体检测.在本文 ...
- Dynamic Anchor Learning for Arbitrary-Oriented Object Detection(DAL)
面向任意目标检测的动态锚点学习 摘要:面向任意的目标广泛地出现在自然场景.航空照片.遥感图像等中,因此面向任意的目标检测得到了广泛的关注.目前许多旋转探测器使用大量不同方向的锚点来实现与地面真实框的空 ...
- Java语言中的这些知识点有没有用过,工作中有没有入过这些坑?
在Java语言中,有一些相对生僻的知识,平时用的机会可能不是很多,但如果不了解不掌握这些知识点的话,也可能会掉入陷阱之中,今天我们就来初步梳理一下: 1. goto是java语言中的关键字. &quo ...