HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)
原题:
http://acm.hdu.edu.cn/showproblem.php?pid=5651
- 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减字母。
- 当能构成回文串时,我们只需考虑这个回文串左半部分的情况,所以这个问题也就变成了求一半字符串的有重复的全排列。
- 因为应用全排列公式中,会用大数除以大数再取余,除法不能简单的分子、分母取余再做除法,这时就要用到乘法逆元,同时用费马小定理求乘法逆元
- 相关公式:http://www.cnblogs.com/i2u9/p/full_seq.html
- 乘法逆元及其证明:http://www.cnblogs.com/tiankonguse/archive/2012/08/14/2638949.html
#include<stdio.h>
#include<string.h>
#define maxn 1111
#define mod 1000000007
char s[maxn];
int book[];//记录每个字母出现次数
long long fact[maxn];//计算保存阶乘
//求快速幂
long long fpow(long long a,long long b){
long long res = ;
while(b){
if(b&)
res = res*a%mod;
b >>= ;
a = a*a%mod;
}
return res;
}
int main(){
//计算阶乘,全排列用
fact[] = ;
for(int i = ;i<maxn;i++)
fact[i] = fact[i-]*i%mod;
int t;
scanf("%d",&t);
while(t--){
memset(book,,sizeof(book));
scanf(" %s",s);
for(int i = ;s[i];i++){
book[s[i]-'a']++;
}
int cnt = ;//计算出现奇数次字母的个数
for(int i= ;i<;i++){
if(book[i]&)
cnt++;
book[i] /= ;
}
int len = strlen(s);
if(cnt >){
puts("");
}else{
long long ans = fact[len/];
for(int i = ;i<;i++)
if(fact[book[i]])
ans = ans*fpow(fact[book[i]],mod-)%mod;
printf("%I64d\n",ans);
}
}
return ;
}
y=n!x
1
!x
2
!x
3
!⋯x
k
!y=n!
x
1
!x
2
!x
3
!⋯x
k
!y=n!
x
1
!x
2
!x
3
!⋯x
k
!y=n!
x
1
!x
2
!x
3
!⋯x
k
!
HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)的更多相关文章
- 牛客练习赛64 如果我让你查回文你还爱我吗 线段树 树状数组 manacher 计数 区间本质不同回文串个数
LINK:如果我让你查回文你还爱我吗 了解到了这个模板题. 果然我不会写2333... 考试的时候想到了一个非常辣鸡的 线段树合并+莫队的做法 过不了不再赘述. 当然也想到了manacher不过不太会 ...
- 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- [bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT
Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...
- hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)
题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3. ...
- 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum
Sum Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4704 Mean: 给定一个大整数N,求1到N中每个数的因式分解个数的 ...
- 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...
- hdu 4869 Turn the pokers(组合数+费马小定理)
Problem Description During summer vacation,Alice stay at home for a long time, with nothing to do. S ...
- HDU 4704 Sum(隔板原理+组合数求和公式+费马小定理+快速幂)
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=4704 Problem Description Sample Input 2 Sample Outp ...
- 【bzoj1951】[Sdoi2010]古代猪文 费马小定理+Lucas定理+中国剩余定理
题目描述 求 $g^{\sum\limits_{k|n}C_{n}^{\frac nk}}\mod 999911659$ 输入 有且仅有一行:两个数N.G,用一个空格分开. 输出 有且仅有一行:一个 ...
随机推荐
- centos7 + VMware Workstation Pro
centos7 + VMware Workstation Pro安装 centos 7 镜像文件 下载地址https://www.centos.org/download/ 笔者是使用的DVD ISO, ...
- JS定时器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux常用服务部署与优化之NFS篇
NFS(network file system)的简称,是linux系统之间常用的一种文件共享方式,下面简述其搭建过程,需要两个linux系统的虚拟机,假设客户端的ip为192.168.1.105,服 ...
- ubuntu下怎么解决python "Non-ASCII character"错误
解决方法:源代码文件第一行添加:#coding:utf-8 参考: http://jingyan.baidu.com/album/219f4bf7d04887de442d3899.html?pici ...
- addEventListener进一步了解
<body> <button id="loading" a="xx"></button> <script type=& ...
- ecshop默认配置
手机端 1.C, 系统默认所有配置 输出:print_r(C())
- array_filter移除空数组
$arr = array( "0"=> "564645", "1"=>"", "2"=& ...
- UITableViewCell的separator分隔线设置失效
// 处理separator -(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSe ...
- Tomcat 系统架构与设计模式
Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...
- yii2中事务不能回滚的解决
$player1 = Player::findOne(1); $player1->nickname = '111'; $player2 = Player::findOne(2); $player ...