题面

Description

用m种字母构造一个长度为n的字符串,如果一个字符串的字母重组后可以形成一个回文串则该串合法,问随机构成的长为n的字符串的合法子串数目期望值.

Input

第一行一整数T表示用例组数,每组用例输入两个整数n,m(1≤n,m≤2000).

Output

问构成的字符串的合法子串数目期望值,结果乘m^n后模10^9+7.

题解

这是一道很好的练指数型母函数的题。

万幸它乘了个m^n,刚好把期望中的m^-n消去了。

考虑到合法字串的特征,它必须最多只有一种字母出现奇数次,其余出现偶数次,那我们分子串长度为奇偶(即,是否有字母出现奇数次)两种情况讨论。

奇的生成函数:

二项式展开:

最终的答案还要考虑其在母串中的出现次数

偶的生成函数:

二项式展开:

最终的答案考虑其在母串中的出现次数

把组合数和幂都预处理,最终复杂度

CODE

大常数TLE的代码QAQ

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
//优化
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
#define LL long long
#define MAXN 105
#define rg register
#define DB double
using namespace std;
inline int read() {
int f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
return x * f;
}
int mod = 1000000007ll;
inline int qkpow(int a,int b) {
int res = 1;
while(b) {
if(b&1) res = 1ll*res*a % mod;
a = 1ll*a*a % mod;
b>>=1;
}
return res % mod;
}
int n,m,q,i,j,s,o,k,t;
int c[2005][2005];
int po[4010][2005];
int dp[2005],inv2 = qkpow(2,mod-2),inv2m[2005];
bool f[2005];
inline int POW(int i,int j) {
return po[i + 2000][j];
}
int main() {
c[0][0] = 1ll;inv2m[0] = 1ll;
for(rg int i = 1;i <= 2000;++ i) {
c[i][0] = c[i][i] = 1ll;
for(rg int j = 1;j < i;++ j) c[i][j] = (0ll + c[i-1][j]+c[i-1][j-1]) % mod;
inv2m[i] = (LL)inv2m[i-1]*inv2%mod;
}
for(rg int i = 0;i <= 4002;++ i) {
po[i][0] = 1ll;
for(rg int j = 1;j <= 2000;++ j) {
po[i][j] = ((LL)po[i][j-1]*(i-2000ll) + mod) % mod;
}
}
rg int T = read();
while(T--) {
n = read();m = read();
int AS = 0;
for(rg int i = 1;i <= n;++ i) {
if(i&1) {
int ans = (LL)inv2m[m] * (n - i + 1ll) % mod * POW(m,n-i) % mod * m % mod;
int ans2 = 0;
for(rg int j = 0;j < m;++ j) {
ans2 = (0ll+ans2 + mod + (POW((j<<1)+2-m,i) + mod - POW((j<<1)-m,i) + mod) * c[m-1][j] % mod) % mod;
}
ans = (LL)ans * ans2 % mod;
AS = (0ll + AS + mod + ans) % mod;
}
else {
int ans = (LL)inv2m[m] * (n - i + 1ll) % mod * POW(m,n-i) % mod;
int ans2 = 0;
for(rg int j = 0;j <= m;++ j) {
ans2 = (0ll+ans2 + mod + ((LL)POW((j<<1)-m,i) + mod) * c[m][j] % mod) % mod;
}
ans = (LL)ans * ans2 % mod;
AS = (0ll + AS + mod + ans) % mod;
}
}
printf("%d\n",AS);
}
return 0;
}

HDU 5362 Just A String 指数型母函数的更多相关文章

  1. HDU 2065 “红色病毒”问题 --指数型母函数

    这种有限制的类棋盘着色问题一般可以用指数型母函数来解决,设Hn表示这样的着色数,首先H0=1,则Hn等于四个字母的(A,B,C,D)的多重集合的n排列数,其中每个字母的重数是无穷,且要求A,C出现的次 ...

  2. 2015 Multi-University Training Contest 6 hdu 5362 Just A String

    Just A String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  3. 母函数 <普通母函数(HDU - 1028 ) && 指数型母函数(hdu1521)>

    给出我初学时看的文章:母函数(对于初学者的最容易理解的) 普通母函数--------->HDU - 1028 例题:若有1克.2克.3克.4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案? ...

  4. 排列组合 HDU - 1521 -指数型母函数

    排列组合 HDU - 1521 一句话区分指数型母函数和母函数就是 母函数是组合数,指数型母函数是排列数 #include<bits/stdc++.h> using namespace s ...

  5. hdu1521 指数型母函数

    排列组合 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. hdu1521:排列组合---指数型母函数

    题意: n种元素,每种有 ni个,选出 m 个的排列有多少种 题解: 指数型母函数的裸题 x^n 项的系数为  an/n!.... 代码如下: #include <iostream> #i ...

  7. 【指数型母函数+非递归快速幂】【HDU2065】"红色病毒"问题

    大一上学完数分上后终于可以搞懂指数型母函数了.. 需要一点关于泰勒级数的高数知识 题目在此: "红色病毒"问题 Time Limit: 1000/1000 MS (Java/Oth ...

  8. 【指数型母函数】hdu1521 排列组合

    #include<cstdio> #include<cstring> using namespace std; int n,m,jiecheng[11]; double a[1 ...

  9. hdu1521 排列组合 指数型母函数模板题

    排列组合 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 2021.04.03【NOIP提高B组】模拟 总结

    T1 题目大意:求最小的 \(n\in[0,lim]\) 使得区间 \([L,R]\) 在线段树建树 \(build(0,n)\) 的区间内 考场时想到了正解,结果推式子退错了... 其实就是从下往上 ...

  2. python爬虫之JS逆向

    Python爬虫之JS逆向案例 由于在爬取数据时,遇到请求头限制属性为动态生成,现将解决方式整理如下: JS逆向有两种思路: 一种是整理出js文件在Python中直接使用execjs调用js文件(可见 ...

  3. ACM-01背包问题-Python

    日后完善 二维数组实现 if __name__ == '__main__': # 背包空间 space = 10 # 默认第一个元素为 0, 仅仅是为了方便理解 weights = [0, 2, 2, ...

  4. React技巧之检查元素是否可见

    原文链接:https://bobbyhadz.com/blog/react-check-if-element-in-viewport 作者:Borislav Hadzhiev 正文从这开始~ 总览 在 ...

  5. 搭建uipath

    我对windows也不太熟,也是第一次安装Uipath Orchestrator,希望有问题指出一起交流,可以留言,Uipath中文qq交流群:4656303241. 下载镜像 windows ser ...

  6. bat-设置oracle服务

    1.停止oracle所有服务 并将服务设置为手动启动 @echo off echo oracle服务--------停止 net stop OracleVssWriterORCL net stop O ...

  7. 通过input的name属性取值

    HTML中 Script中 根据选中的值,res也就拿到相应的值.

  8. 从20s优化到500ms,我用了这三招

    前言 接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题.想要优化一个接口的性能,需要从多个方面着手. 其实,我之前也写过一篇接口性能优化相关的文章<聊聊接口性能优化的11个小技巧&g ...

  9. 6 分钟看完 BGP 协议。

    上一篇文章见 万字长文爆肝路由协议! 上面我们聊 RIP .OSPF 协议都是基于 AS 即自治系统内的协议,可以把它们认为是域内路由协议:而下面我们要聊的就是 AS 之间的协议了,这也叫做域间路由协 ...

  10. JDBC:Statement问题

    1.Statement问题  2.解决办法:通过PreparedStatement代替  实践: package com.dgd.test; import java.io.FileInputStrea ...