阿里郎
题目大意
就是有一个数n,求出它的所有约数d,共有多少个约数就一共分多少种情况,共分为d组,把1,d+1,2d+1……n-d+1分为一组,以此类推,而且同一组内相邻的人编号不能相同…现在要求字典序最小的编号总和.无解输出"Impossible"
输入样例
7
输出样例
abababc
数据范围
解题思路
其实就是先求出约数总和,再来分组来,枚举每个点和每个环,求出每个环最小的点即可…
程序如下
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int n, t, r[ 300001 ] , a[ 300001 ] , f[ 101 ] , s;
int main ( )
{
freopen ( "arilang.in" , "r" , stdin ) ;
freopen ( "arilang.out" , "w" , stdout ) ;
scanf ( "%d" , & n) ;
for ( int i= 1 ; i< n; ++ i)
{
if ( n% i== 0 )
{
r[ ++ t] = i;
}
}
a[ 1 ] = 1 ;
for ( int i= 2 ; i<= n; ++ i)
{
memset ( f, 0 , sizeof ( f) ) ;
for ( int j= 1 ; j<= t; ++ j)
{
f[ a[ ( i+ r[ j] - 1 ) % n+ 1 ] ] = 1 ;
f[ a[ ( i+ n- r[ j] ) % n] ] = 1 ;
}
for ( int j= 1 ; j<= 26 ; ++ j)
{
if ( ! f[ j] )
{
a[ i] = j;
break ;
}
}
if ( ! a[ i] )
{
printf ( "Impossible" ) ;
s= 1 ;
break ;
}
}
if ( ! s)
{
for ( int i= 1 ; i<= n; ++ i)
putchar ( a[ i] + 96 ) ;
}
return 0 ;
}