题意:有n个点均匀的分布在圆周上,每个点有0,1两种状态,问你所有 1的点能否主城正多边形。
解题思路:数论 + dp ,假设可以组成正 t 边形 ,那么 t 一定要是 n的因子 ,又因为如果能组成 正t边形 ,一定能组成 正 2*t 边形,3*t边行等等,所以只需要质因子。
然后用 0 去排除这些质因子是否可行就行了。
解题代码:
1 // File Name: 71c.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月20日 星期五 21时45分50秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 100001 26 using namespace std; 27 int a[100005]; 28 int hs[100005]; 29 int n; 30 int tt; 31 int zyz[10]; 32 int dp[10][100050]; 33 void sai() 34 { 35 int li = sqrt(n)+1; 36 for(int i = 2;i <= li ;i ++) 37 { 38 if(hs[i] == 0) 39 { 40 int k = i*i ; 41 while(k <= n) 42 { 43 hs[k] = 1; 44 k += i ; 45 } 46 } 47 } 48 hs[4] = 0 ; 49 hs[2] = 1; 50 tt = 0 ; 51 for(int i = 2;i <= n ;i ++) 52 { 53 if(hs[i] == 0 && n % i == 0 ) 54 { 55 tt ++ ; 56 zyz[tt] = n/i ; 57 } 58 } 59 } 60 int main(){ 61 scanf("%d",&n); 62 sai(); 63 /*for(int i = 1;i <= tt; i ++) 64 printf("%d ",zyz[i]); 65 printf("\n");*/ 66 int tmp ; 67 for(int i = 1;i <= n;i ++) 68 { 69 scanf("%d",&tmp); 70 if(tmp == 0 ) 71 { 72 for(int j = 1; j <= tt; j++) 73 { 74 dp[j][i%zyz[j]] = 1; 75 } 76 } 77 } 78 for(int i = 1;i <= tt;i ++) 79 { 80 for(int j =0 ;j < zyz[i];j ++) 81 if(dp[i][j] == 0) 82 { 83 printf("YES\n"); 84 return 0 ; 85 } 86 } 87 printf("NO\n"); 88 return 0; 89 }
时间: 2024-10-20 05:35:17