Codeforces 1161B(判断旋转对称)

要点

  • 外层暴力枚举转的“角度”,会发现肯定是n的约数
  • 对于m条线段想判定当前的“角度”是否ok,每个线段只要管它自己的下一个即可,不必画个圈遍历一遍
  • 之后将本来的线段集合和当前需要的线段集合比较,如果相同则该图形旋转对称
  • 一个小优化是只需要枚举n的质约数,质约数d含义为把圆划分成d份。这样划分成6份根本不必要枚举,如果6份行的话,2份的时候就跑出去了;如果6份不行的话……所以就不用枚举它呀~
const int maxn = 1e5 + 5;
int n, m;
vector<pii> p;
vector<int> d;

void pre(int n) {
    for (int i = 2; i <= n; i++) {
        if (n % i)  continue;
        d.emplace_back(i);
        while (n % i == 0)  n /= i;
    }
}

int main() {
    read(n), read(m);
    pre(n);
    for (int i = 1, a, b; i <= m; i++) {
        read(a), read(b);
        a--, b--;
        if (a > b)  swap(a, b);
        p.emplace_back(a, b);
    }
    sort(All(p));

    for (int x : d) {
        int k = n / x;
        vector<pii> t;
        rep(i, 0, m - 1) {
            int a = p[i].first, b = p[i].second;
            a = (a + k) % n, b = (b + k) % n;
            if (a > b)  swap(a, b);
            t.emplace_back(a, b);
        }
        sort(All(t));
        if (p == t) {
            puts("Yes"); return 0;
        }
    }
    puts("No"); return 0;
}

原文地址:https://www.cnblogs.com/AlphaWA/p/10961662.html

时间: 2024-10-13 04:26:43

Codeforces 1161B(判断旋转对称)的相关文章

CodeForces - 416A (判断大于小于等于 模拟题)

Guess a number! Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status Description A TV show called "Guess a number!" is gathering popularity. The whole Berland, the old and the young, are watching the sho

构造树并判断是否对称

class Node { constructor (val) { this.val = val this.left = this.right = undefined } } class Tree { constructor (data) { // 临时存储所有节点 let nodeList = [] // 根节点 let root for (let i = 0, len = data.length; i < len; i++) { let node = new Node(data[i]) nod

判断二叉树是否对称的代码

思路:要判断一颗二叉树是否对称,要判断一下几点,可以用递归来实现: 判断一颗二叉树是不是对称的,等价于判断其左右子树是不是镜像对称的 判断镜对称像即判断对称的位置上的元素是不是相等 两个节点A和B对称等价于:  这两个节点上存储的值相等 节点A的左子树节点和节点B的右子树上的节点是对称的 节点A的右子树节点和节点A的左子树上的节点是对称的 看代码: class Solution { public: bool isTreeSymmertic(TreeNode *pHead1,TreeNode *p

leetcode-Symmetric Tree 对称树

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For example, this binary tree is symmetric: 1 / 2 2 / \ / 3 4 4 3 But the following is not: 1 / 2 2 \ 3 3 方法一: 层次遍历是最直观的方法.对数进行层次遍历,记录每一层的节点,然后对每一层的value组成

在ios8中做的屏幕旋转功能

http://www.cnblogs.com/smileEvday/archive/2013/04/24/Rotate2.html 思路出自这篇博主的文章. 直接上代码 -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { NSLog(@"你旋转了"); if (toInterf

对称树

闲着没事,做两道题玩玩,有一些地方还是有一些意思的: 1 ```c++ 2 bool isSymmetric(TreeNode *root) 3 { 4 //约定空树是对称的 5 if(root==NULL) 6 return true; 7 else 8 return isEqual(root->left,root->right); 9 } 10 //判断是否对称,应该是有两个指针去指的,因此写一个两个指针参数的判断函数,递归的进行判断 11 bool isEqual(TreeNode *a

DAY13 Matlab直角坐标系实现图像旋转

% 直角坐标系实现图像旋转im=rgb2gray(imread('robot.jpg'));figure,imshow(im);[row,col]=size(im);a=pi/6; % 逆时针旋转30度 %得到行的初始矩阵r1=repmat(1:row,row,1);i=r1'; %得到列的初始矩阵j=repmat(1:col,col,1); i1=zeros(row,col);for m=1:row for n=1:col i1(m,n)=round(m*cos(a)-n*sin(a)); %

最长对称子串

//求一个字符串中最长对称字串,好像有点如google,那么输出goog /* O(n2)的算法 如果我们换一种思路,我们从里向外来判断.也就是我们先判断子字符串A是不是对称的. 如果A不是对称的,那么向该子字符串两端各延长一个字符得到的字符串肯定不是对称的. 如果A对称,那么我们只需要判断A两端延长的一个字符是不是相等的,如果相等,则延长后的字符串是对称的. 因此在知道A是否对称之后,只需要O(1)的时间就能知道aAa是不是对称的. */ #include <iostream> #inclu

旋转图片,空余部分补黑色,并将原坐标转换

#载入必要的模块 import os from PIL import Image from PIL import ImageDraw import sys import xlrd import numpy import math import xlsxwriter #输入 ExcelFile=xlrd.open_workbook(r'.\标记信息.xlsx') sheet=ExcelFile.sheet_by_index(0) #输出 workbook = xlsxwriter.Workbook