阿里郎
题目大意
- 就是有一个数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;
}