33,027
社区成员




public static void main(String[] args) {
System.out.println(test1("hqaymehhrsfuqrpahrimsxftuxqrpsejouuehaqtsryxjhearxmogmi"));
}
static int test1(String s) {//aabb A(5,5)/A(2,2)*(1+1/A(2,2))
s = s.toLowerCase();
int[] array = new int[26];
for (int i = 0; i < s.length(); i++) {
array[s.charAt(i) - 97]++;
}
int temp = 0;
double num=factorial(s.length()/2);
for (int i : array) {
if (i == 0)
continue;
if (i % 2 != 0 && temp++ > 0) {
return 0;
}
num /= factorial(i>>1);
}
return (int)(num%1000000007);
}
/**
* 阶乘
* @param n
*/
static double factorial(int n) {
double rtnNum = 1;
for (int i = 2; i <= n; i++) {
rtnNum *= i;
}
return rtnNum;
}
int iBase = 1000000007;
//计算组合数C(m,n)//结果对iBase求余
int comb(int m,int n)
{
if (n*2 > m)
{
return comb(m,m-n);
}
//最大值C(50,2)
//int 不够用 __int64就够了
__int64 ires = 1;
for (int i=1;i<=n;i++)
{
ires *= m-n+i;
ires /= i;//利用下标从1开始的肯定能整除
//此时的ires = C(m_-n+i,i)
}
return (ires%iBase);
}
int palindrome(const char *s)
{
int flag[256] = {0};
//统计字符出现次数
while((*s)!='\0')
{
int index = *s + 128;
flag[index]++;
s++;
}
bool bsingl = false;//是否有奇数次字符
int ires = 1;
int itotal = 0;
int ilength = 0;
for(int i = 0;i<256;i++)
{
int icount = flag[i];
if (icount%2 == 1)
{
if (bsingl)
{
return 0;
}
bsingl = true;
}
icount /= 2;
if (icount<1)
{
continue;
}
ilength+= icount;
if (ilength>50)
{
// return -1;
}
if (icount>0)
{
itotal += icount;
ires %= iBase;
int itemp = comb(itotal,icount);
__int64 ires_64 = ires;
ires_64 *= itemp;
ires = (ires_64%iBase);
printf("%d\n",ires);
}
}
ires %= iBase;
return ires;
}
int main()
{
const char* str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
printf("\n%s\n%d",str,palindrome(str));
str = "hqaymehhrsfuqrpahrimsxftuxqrpsejouuehaqtsryxjhearxmogmi";
printf("\n%s\n%d",str,palindrome(str));
system ("pause");
return 0;
}
答案是#2的676517829
我前面算错了