题目链接:

hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5651

bc:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=682&pid=1002

xiaoxin juju needs help

 Accepts: 150
 Submissions: 966
 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 65536/65536 K (Java/Others)
Problem Description

As we all known, xiaoxin is a brilliant coder. He knew palindromic strings when he was only a six grade student at elementry school.

This summer he was working at Tencent as an intern. One day his leader came to ask xiaoxin for help. His leader gave him a string and he wanted xiaoxin to generate palindromic strings for him. Once xiaoxin generates a different palindromic string, his leader will give him a watermelon candy. The problem is how many candies xiaoxin's leader needs to buy?

Input

This problem has multi test cases. First line contains a single integer T(T\leq 20)T(T≤20) which represents the number of test cases. For each test case, there is a single line containing a string S(1 \leq length(S) \leq 1,000)S(1≤length(S)≤1,000).

Output

For each test case, print an integer which is the number of watermelon candies xiaoxin's leader needs to buy after mod 1,000,000,0071,000,000,007.

Sample Input
3
aa
aabb
a
Sample Output
1
2
1

题解:

1、可行性:

统计每个字母出去的次数,如果有两种即以上字母出现的次数为奇数,则一定不可能排出回文串。

2、统计:

由于回文串左右两边必须相同,所以我们考虑一边就可以了(如果为奇数则正中间一个不管就和偶数情况是一样的了)。

则可以转化为排列组合问题,等价于求解: (cnt[i]代表某个字母出现的次数(cnt[i]>0) )

( )%(1e9+7)

由于涉及到除法,要求逆元:

例子:

  求a/b(mod n) 如果b与n互质,则求满足bx=1(%n)的一个解x,原式可转化为a/b*bx(%n),即a*x(%n);这样就把除法消除了。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int maxn = + ;
const int mod = 1e9 + ;
typedef long long LL; char str[maxn];
int n; int cnt[];
int tmp[], tot; LL b[maxn];
//预处理出阶乘
void pre() {
b[] = b[] = ;
for (int i = ; i < maxn; i++) b[i] = (b[i - ] * i) % mod;
}
//扩展的欧几里得算法求逆元
void gcd(LL a, LL b, LL &d, LL &x, LL &y) {
if (!b) {
d = a;
x = ; y = ;
}
else {
gcd(b, a%b, d, y, x);//y=x',x=y';
//x=y'; y=x'-(a/b)*y';
y -= (a / b)*x;
}
} void init() {
tot = ;
memset(cnt, , sizeof(cnt));
} int main() {
pre();
int tc;
scanf("%d", &tc);
while (tc--) {
init();
scanf("%s", str);
n = strlen(str);
for (int i = ; i < strlen(str); i++) {
cnt[str[i] - 'a']++;
}
int flag = ;
for (int i = ; i < ; i++) {
if (cnt[i] % ) flag++;
//统计一半的字母出现的次数
if (cnt[i] > ) {
tmp[tot++] = cnt[i] / ;
}
}
if (flag > ) { printf("0\n"); continue; }
LL sum = ;
for (int i = ; i < tot; i++) {
int t = tmp[i];
sum = (sum*b[t]) % mod;
}
LL d, x, y;
gcd(sum, mod, d, x, y);
//x有可能是负数,需要处理成正的。
x = (x%mod + mod) % mod;
LL ans = (b[n / ] * x) % mod;
printf("%lld\n", ans);
}
return ;
}

HDU 5651 xiaoxin juju needs help 逆元的更多相关文章

  1. hdu 5651 xiaoxin juju needs help 逆元 两种求解方式

    xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  2. HDU - 5651 xiaoxin juju needs help 逆元模板

    http://acm.hdu.edu.cn/showproblem.php?pid=5651 题意:生成回文串.输出所有回文串的可能数. 题解:mod除法会损失高位,用逆元来代替除法,模板如下 ac代 ...

  3. HDU 5651 xiaoxin juju needs help 数学

    xiaoxin juju needs help 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5651 Description As we all k ...

  4. HDU 5651 xiaoxin juju needs help (组合数)

    xiaoxin juju needs helpTime Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64uSu ...

  5. HDU 5651 xiaoxin juju needs help

    组合数杨辉三角打表,这样避免了除法求逆元. #include<cstdio> #include<cstring> #include<cmath> #include& ...

  6. HDU 5651 xiaoxin juju needs help 水题一发

    分析:求一下组合数 首先,如果不止一个字符出现的次数为奇数,则结果为0. 否则,我们把每个字符出现次数除2,也就是考虑一半的情况. 那么结果就是这个可重复集合的排列数了. fact(n)/fact(a ...

  7. hdu5651 xiaoxin juju needs help(逆元)

    xiaoxin juju needs help  Accepts: 150  Submissions: 966  Time Limit: 2000/1000 MS (Java/Others)  Mem ...

  8. hdu5651 xiaoxin juju needs help (多重集的全排列+逆元)

    xiaoxin juju needs help 题意:给你一个字符串,求打乱字符后,有多少种回文串.                      (题于文末) 知识点: n个元素,其中a1,a2,··· ...

  9. HDU 5651 逆元

    xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

随机推荐

  1. Linux多进程CS服务器简单测试

    Linux多进程CS服务器简单实现 server端 多进程实现多用户连接,即每个用户一个连接,这里仍然用server将收到的字符串转大写后返回给客户端. 代码实现 #include <stdio ...

  2. 树莓派3B+学习笔记:13、不间断会话服务screen

    screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序.用户还可以使用screen服务程序同时在多个远程会话中自由切换,能够 ...

  3. 加法变乘法——第六届蓝桥杯C语言B组(省赛)第六题

    原创 加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:1+2+3+...+10*11+12+...+27*28+ ...

  4. golang 后台服务设计精要

    原文地址 守护进程 传统的后台服务一般作为守护进程(daemon)运行.linux 上创建 daemon 的步骤一般如下: 创建子进程,父进程退出: 调用系统调用 setsid() 脱离控制终端: 调 ...

  5. go学习之文件读取问题(需更新)

    go学习之文件读取问题(需更新) 一,问题: 今天做一个GO广度迷宫问题时,出现了一个奇怪的问题. 就是通过fmt.Fscanf()读取文件时,每行末尾多出一个0. 二,问题代码: 1,输入文件maz ...

  6. ubuntu 和windows 分别在anaconda上安装tensorflow

    windows下 的anaconda安装tensorflow: 在Anaconda Prompt中:conda install tensorflow python=3.5一直下载失败.总结一下原因可能 ...

  7. 20155218 《Java程序设计》实验五(网络编程与安全)实验报告

    20155218 <Java程序设计>实验五(网络编程与安全)实验报告 一.实验内容及步骤 (一) 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面 ...

  8. 20155308 2016-2017-2 《Java程序设计》第10周学习总结

    20155308 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 网络概述 计算机网络:通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络 ...

  9. 20155320 2016-2017-2 《Java程序设计》第二周学习总结

    20155320 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 本周主要学习了java语言的基础语法,我发现与以前学过的c语言有许多共同点,无论是从一些基本 ...

  10. WPF 背景颜色渐变的滑动条实现

    原文:WPF 背景颜色渐变的滑动条实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83507 ...