唉,这么简单的一道题提交了8次才通过,开始想用回溯严重超时,后面就是对大数的处理想的不周。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 26
int numofchar[N];
long long sum = 0;
int time;
int cmp(const void *x, const void *y)
{
return *(int *)y - *(int *)x;
}
int factorial(int num)
{
int i;
long long sum = 1;
for(i = 1; i <= num; ++i)
{
sum = (sum * i);
}
return sum;
}
int result(int num)
{
int i;
long long sum = 1;
int flag = 0;
int tmp[26];
int j;
for(i = 0; i < time; ++i)
{
tmp[i] = factorial(numofchar[i]);
}
j = 0;
for(i = 2; i <= num; ++i)
{
if(j < time)
{
if(sum % tmp[j] == 0)
{
sum /= tmp[j];
++j;
}
}
sum = (sum * i) % 1000000007;
}
return sum;
}
int palindrome(const char *s)
{
int index;
const char *p;
int i;
int oddflag;
int all;
memset(numofchar, 0, sizeof(numofchar));
p = s;
while(*p != '\0')
{
index = *p - 'a';
++numofchar[index];
++p;
}
qsort(numofchar, 26, sizeof(int), cmp);
oddflag = 0;
for(i = 0; i < N; ++i)
{
if(numofchar[i] & 0x01 == 1)
{
--numofchar[i];
++oddflag;
}
if(numofchar[i] == 0)
{
break;
}
}
time = i;
if(oddflag > 1)
{
return 0;
}
all = 0;
for(i = 0; i < time; ++i)
{
numofchar[i] >>= 1;
all += numofchar[i];
}
sum = result(all);
return sum;
}
int main()
{
char *s = "ihjffefyfvfurraskxosxmfohpdeexgfdmtfvffobjpjjxbkuekyxsxpjhmsigdhojbmxptxokoba";
//hqaymehhrsfuqrpahrimsxftuxqrpsejouuehaqtsryxjhearxmogmi
//zsmjajrycysuqjvyyraqvoyggmjgsuiyvclurvmygoivmsurgxsyyblvbgxsszlsly
//ihjffefyfvfurraskxosxmfohpdeexgfdmtfvffobjpjjxbkuekyxsxpjhmsigdhojbmxptxokoba
palindrome(s);
printf("%lld\n", sum);
return 0;
}