题目链接:
题目大意:
一个各个点等距离的原环,有一些好点,问能否只用这些好点构成一个正多边形
题目分析:
首先枚举多边形可能分割的的每部分点的数量,只可能被n整除,那么就是枚举被n整数的数,然后枚举每个循环节里的起点,然后判断能否构成正多边形。复杂度O(n⋅n√)
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 100007
using namespace std;
int n;
int a[MAX];
int main ( )
{
memset ( a , 0 , sizeof ( a ));
while ( ~scanf ( "%d" , &n ) )
{
for ( int i = 0 ; i < n ; i++ )
scanf ( "%d" , &a[i] );
int x = n;
bool flag = false;
for ( int i = 1 ; i <= n/3 ; i++ )
{
if ( n%i ) continue;
for ( int j = 0 ; j < i ; j++ )
{
bool mark = true;
int k = j;
while ( k < n+i )
{
int x = k%n;
if ( !a[x] )
{
mark = false;
break;
}
k += i;
}
if ( mark )
{
flag = true;
break;
}
}
if ( flag ) break;
}
if ( flag ) puts ( "YES" );
else puts ( "NO" );
}
}