93 lines
1.5 KiB
C++
93 lines
1.5 KiB
C++
/*我实在是想不出能够在任何情况下过这道题的搜索算法,于是毫不犹豫上排列组合*/
|
|
/*搜索算法一直是弱菜*/
|
|
#include<cstdio>
|
|
#include<cstring>
|
|
#define mo 10000
|
|
char s[501],PNb[501];
|
|
int num[256],PNn[501];
|
|
int exist[501],ans[5000];
|
|
int n;
|
|
|
|
void InitPN(int n)
|
|
{
|
|
memset(PNb,1,sizeof(PNb));
|
|
PNb[0]=0;
|
|
PNb[1]=0;
|
|
for (int i=2;i<=n;i++)
|
|
if (PNb[i]) {
|
|
PNn[++PNn[0]]=i;
|
|
for (int k=i*2;k<=n;k+=i) {
|
|
PNb[k]=0;
|
|
}
|
|
}
|
|
}
|
|
|
|
void mul(int * a,int c)
|
|
{
|
|
int i,x=0;
|
|
for (i=1;i<=a[0];i++)
|
|
{
|
|
a[i]=a[i]*c+x;
|
|
x=a[i]/mo;
|
|
a[i]=a[i]%mo;
|
|
}
|
|
while(x>0)
|
|
{
|
|
a[++a[0]]=x%mo;
|
|
x=x/mo;
|
|
}
|
|
}
|
|
|
|
void print_arr(int * a)
|
|
{
|
|
int i;
|
|
printf("%d",a[a[0]]);
|
|
for (i=a[0]-1;i>0;i--)
|
|
printf("%04d",a[i]);
|
|
putchar('\n');
|
|
}
|
|
|
|
|
|
int main(void)
|
|
{
|
|
scanf("%d",&n);
|
|
while (getchar()!='\n');
|
|
gets(s);
|
|
for (int i=0;i<n;i++) num[s[i]]++;
|
|
InitPN(n);
|
|
for (int i=1;i<=PNn[0];i++) {
|
|
for (int k=PNn[i];k<=n;k*=PNn[i]) {
|
|
exist[i]+=n/k;
|
|
}
|
|
}
|
|
/*for (int i=1;i<=PNn[0];i++)
|
|
printf("%d ",exist[i]);
|
|
putchar('\n'); */
|
|
for (int nu=0;nu<=255;nu++) {
|
|
if (num[nu]>1) {
|
|
int tmp=num[nu];
|
|
for (int i=1;i<=PNn[0];i++) {
|
|
for (int k=PNn[i];k<=tmp;k*=PNn[i]) {
|
|
exist[i]-=tmp/k;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
for (int i=1;i<=PNn[0];i++)
|
|
printf("%d ",exist[i]);
|
|
putchar('\n');
|
|
*/
|
|
ans[0]=1;
|
|
ans[1]=1;
|
|
for (int i=1;i<=PNn[0];i++)
|
|
{
|
|
for (int j=1;j<=exist[i];j++)
|
|
mul(ans,PNn[i]);
|
|
}
|
|
print_arr(ans);
|
|
//puts(s);
|
|
return 0;
|
|
}
|
|
|
|
|