HDU 5362 Just A String 指数型母函数
题面
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 指数型母函数的更多相关文章
- HDU 2065 “红色病毒”问题 --指数型母函数
这种有限制的类棋盘着色问题一般可以用指数型母函数来解决,设Hn表示这样的着色数,首先H0=1,则Hn等于四个字母的(A,B,C,D)的多重集合的n排列数,其中每个字母的重数是无穷,且要求A,C出现的次 ...
- 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 ...
- 母函数 <普通母函数(HDU - 1028 ) && 指数型母函数(hdu1521)>
给出我初学时看的文章:母函数(对于初学者的最容易理解的) 普通母函数--------->HDU - 1028 例题:若有1克.2克.3克.4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案? ...
- 排列组合 HDU - 1521 -指数型母函数
排列组合 HDU - 1521 一句话区分指数型母函数和母函数就是 母函数是组合数,指数型母函数是排列数 #include<bits/stdc++.h> using namespace s ...
- hdu1521 指数型母函数
排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu1521:排列组合---指数型母函数
题意: n种元素,每种有 ni个,选出 m 个的排列有多少种 题解: 指数型母函数的裸题 x^n 项的系数为 an/n!.... 代码如下: #include <iostream> #i ...
- 【指数型母函数+非递归快速幂】【HDU2065】"红色病毒"问题
大一上学完数分上后终于可以搞懂指数型母函数了.. 需要一点关于泰勒级数的高数知识 题目在此: "红色病毒"问题 Time Limit: 1000/1000 MS (Java/Oth ...
- 【指数型母函数】hdu1521 排列组合
#include<cstdio> #include<cstring> using namespace std; int n,m,jiecheng[11]; double a[1 ...
- hdu1521 排列组合 指数型母函数模板题
排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- mybatis-plus对空字段 时间进行填充
package com.tanhua.sso.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; imp ...
- 写selenium常用到的js代码
selenium可以运行JavaScript代码,可以用一些JavaScript来辅助编写Selelnium代码. 1.scrollIntoView - 向下拉滚动条,使得某元素可见 IWebElem ...
- ExtJS 布局-Absolute布局(Absolute layout)
更新记录: 2022年5月31日 发布本篇 1.说明 使用xy配置项设置子组件在父容器中绝对位置,本质是将子组件的CSS的position设置为absolute,然后使用x和y配置项映射到CSS的to ...
- SAP HTLM Control
HTML 事件 效果 代码 *&---------------------------------------------------------------------* *& Re ...
- UiPath文本操作Get Visible Text的介绍和使用
一.]Get Visible Text(获取可见文本)操作的介绍 从指示的UI元素中提取字符串及其信息.执行屏幕抓取操作时,还可以自动生成此活动以及容器. 二.Get Visible Text在UiP ...
- 6 分钟看完 BGP 协议。
上一篇文章见 万字长文爆肝路由协议! 上面我们聊 RIP .OSPF 协议都是基于 AS 即自治系统内的协议,可以把它们认为是域内路由协议:而下面我们要聊的就是 AS 之间的协议了,这也叫做域间路由协 ...
- C#请求HTTPS地址的故障分析和TLS知识点总结
背景介绍 近期收到同事反馈,在C#程序中通过HTTPClient请求一个HTTPS的地址时,在本地开发环境和测试环境均能正常执行,而部署到生产环境后发生异常且稳定复现,异常提示为:[请求被中止: 未能 ...
- 干货 |《2022B2B新增长系列之企服行业橙皮书》重磅发布
企服行业面临的宏观环境和微观环境已然发生了明显的变化.一方面,消费级互联网成为过去式,爆发式增长的时代结束.资本.媒体的目光已经悄然聚焦到以企服行业所代表的产品互联网身上,B2B企业正稳步走向C位. ...
- 如何用Python实现配置热加载?
背景 由于最近工作需求,需要在已有项目添加一个新功能,实现配置热加载的功能.所谓的配置热加载,也就是说当服务收到配置更新消息之后,我们不用重启服务就可以使用最新的配置去执行任务. 如何实现 下面我分别 ...
- Trie树模板1字符串统计
Trie树模板1字符串统计 我们首先来了解一下字典树,首先看一下一张字典树的图片 字典树就是一个可以高效存储.查找字符串的树,比如上面这个字典树就是存储abc,acb,bac的字典树. 1.插入操作( ...