原博客网页——洛谷博客

题目地址

如果您对群论有所了解,那么本题就是对二面体群 \(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 正多边形变换的更多相关文章

  1. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  2. Hilbert-Huang Transform(希尔伯特-黄变换)

    在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...

  3. 【Win 10 应用开发】三维变换

    所谓三维变换,其实是在二维平面上产生三维的视觉效果.前面老周简单提了一下透视效果,如果透视效果不能满需求,那可以考虑用三维变换. UIElement类有一个属性叫Transform3D,它定义的类型为 ...

  4. CSS3之3d变换与关键帧

    3d变换是在transform基础上实现的 transform-style:preserve-3d; 建立3d空间 perspective:; 景深(设置用户看的距离) perspective-ori ...

  5. 纯CSS3实现多层云彩变换飞行动画

    查看效果:http://hovertree.com/texiao/css3/4/效果2 效果图: 代码如下: <!doctype html> <html lang="zh& ...

  6. CSS3之过渡及2D变换

    transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形式 ea ...

  7. 为什么FFT时域补0后,经FFT变换就是频域进行内插?

    应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...

  8. 相机变换与Ray-Casting

    p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify; orphans: 0; widows ...

  9. UVA 12300 Smallest Regular Polygon(正多边形)

    题意:给出两点,求经过这两点的正n边形的最小面积 题解:这两点一定是最长的弦,我们设正多边形中点c,找到c到每个点的距离(都相同) 我们知道那个等腰三角形的底与每个角度就使用余弦定理 #include ...

随机推荐

  1. MySQL之数据操纵语言(DML)

    数据操纵语言(DML) 数据操纵语(Data Manipulation Language),简称DML. DML主要有四个常用功能. 增 删 改 查 insert delete update sele ...

  2. PHP转JAVA开发30分钟实战攻略

    服务端开发中,有很多知识是相通的,例如mysql,redis,http协议等. 基于这些基础,在编程语言上的转变并不困难. 本文主要从下面几点出发,讲述如何快速从php开发转为java开发: 使用框架 ...

  3. TensorRT原理图示

    TensorRT原理图示 NVIDIA的核心 TensorRT是有助于在NVIDIA图形处理单元(GPU)的高性能推理一个C ++库.它旨在与TensorFlow,Caffe,PyTorch,MXNe ...

  4. 关于Numba的线程实现的说明

    关于Numba的线程实现的说明 由Numbaparallel目标执行的工作由Numba线程层执行.实际上,"线程层"是Numba内置库,可以执行所需的并发执行.在撰写本文时,有三个 ...

  5. 使用Nucleus SE实时操作系统

    使用Nucleus SE实时操作系统 Using the Nucleus SE real-time operating system 到目前为止,在本系列文章中,我们详细介绍了Nucleus SE提供 ...

  6. jsp页面抽取

    步骤: 1.先将jsp中要抽取的公共部分剪切出来,黏贴到新的jsp文件中,取名叫xxx.jsp 2.在需要引入此公共部分的jsp页面中使用<%@include file="xxx.js ...

  7. WPF 后台代码做 TranslateTransform 的动画

    本文告诉大家,在后台代码,对 TranslateTransform 做动画的方法 今天小伙伴问我一个问题,说为什么相同的代码,如果设置到按钮上,是可以让按钮的某个属性变更,但是如果设置给 Transl ...

  8. 【NX二次开发】 获取体的面 UF_MODL_ask_body_faces

    获取体的面 1 extern DllExport void ufsta(char *param, int *returnCode, int rlen) 2 { 3 UF_initialize(); 4 ...

  9. 为什么我严重不建议去培训机构参加SAP培训?

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 关于是否要参加SAP培训的话题已经是老生常谈了,知乎上随便一搜有好多人在问是否要去参加SAP培训,底下已经有很多人在上面给出了正确建议.但也 ...

  10. 我试了试用 SQL查 Linux日志,好用到飞起

    大家好,我是小富~ 最近发现点好玩的工具,迫不及待的想跟大家分享一下. 大家平时都怎么查Linux日志呢? 像我平时会用tail.head.cat.sed.more.less这些经典系统命令,或者aw ...