【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)
ACM字符串
.长度不能超过n
.字符串中仅包含大写字母
.生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 输入一个正整数T,代表有T组数据
接下来T行,每行一个正整数n,n<=。 输出 输出符合条件的字符串的数目 样例输入 样例输出
做题过程:
- 熬了三四个小时,WA了无数次!最终推出了组合数的公式!
- 首先暴力打表,嘿嘿!这样极大地压缩计算时间!
- 打表如下:
一:生成连续的7位绝对不含ACM的数据的个数!
ll Els[];//生成7位绝对不含ACM的数据
int a[]; void dfs(int now,int len)
{
if(now>len)
{
Els[len]++;
return ;
}
for( int i=; i<=; i++)
{
a[now]=i;
if(now>=&&a[now]==&&a[now-]==&&a[now-]==)
continue;
dfs(now+,len);
}
}
int main()
{ for(int i=; i<=; i++)
{
dfs(,i);
printf("i=%d, %lld\n",i,Els[i]);
} cout<<"生成连续的7位绝对不含ACM的数据"<<endl;
for(int i=; i<=; i++)
{
printf("i=%d, %lld\n",i,Els[i]);
} return ;
} 二:开始进行组合数学处理,并且处理误差!
- 误差是怎么回事呢?举个栗子当“n=6时,形如当只含有一个ACM时—— “ACM_ _ _”这种样子C(4,1)种组合数(把ACM捆绑成一块!),然后需要C(4,1) 乘于其余三个空位上的数字组合,这三种数字“因为不能再含有ACM”直接调用上面求出的Els[3], 但是这里存在了误差!
- 仔细考虑一下,当出现“_ACM_ _”的组合的这种情况时,其实有Els[1]*Els[2] 种!也就是说中间的“ACM”隔开了两边,我上面求的那么“Els”的真实意思是“生成连续的7位绝对不含ACM的数据个数”!Els[1]*Els[2] -Els[3] = 1 ,这里的误差就是1!以此类推!
- 同理,其他的情况也是如此!多的位数可以跑循环进行枚举!手写就有点麻烦了!
#define ll long long
ll F[]; //n的阶乘
//ll f[12];
///chart表示连续的绝对不含ACM连续的字符串个数,就是上面求出的"Els 数组"
ll chart[]={, ,,, ,,, };
ll mistake[]; ///存储每个长度n的误差!
ll Cul(int m,int k) //计算C(m,k)的组合数
{
return F[m]/(F[k]*F[m-k] );
}
ll ans[]={,,,};
void init(){
F[]=;
for(int i=;i<=;i++) //n的阶乘!
F[i]=F[i-]*i;
memset(mistake,,sizeof(mistake));
mistake[]+= chart[]*chart[]*- *chart[];
mistake[]+= chart[]*chart[]*+chart[]*chart[]- *chart[];
mistake[]+= chart[]*chart[]*+chart[]*chart[]*- *chart[];
mistake[]+= chart[]*chart[]*+chart[]*chart[]*+chart[]*chart[] - *chart[];
mistake[]+= chart[]*chart[]* +chart[]*chart[]*chart[] - chart[]*; for(int i=;i<=;i++) ///__A_____
mistake[]+=chart[i]*chart[-i]-chart[];
for(int j=;j<=;j++){
for(int i=;i+j<=;i++) ///_A__A__(空出j个位置和i个位置和4-i-j个位置!!)
mistake[]+=chart[j]*chart[i]*chart[-i-j]-chart[];
} }
int main(){ init(); for(int j=;j<=;j++)
{
int n=j;
int num=n/;
ans[j]=ans[j-];
for(int i=;i<=num;i++){ //单个的,结果需要累加!!
ans[j]+=Cul(i+n-i*,i)*chart[n-i*] ;
}
// printf("j=%d, %lld\n",j,ans[j]);
ans[j]+= mistake[j];
// printf("+mis:: j=%d, %lld\n",j,ans[j]);
} int T;
scanf("%d",&T); while(T--){
int n;
cin>>n; printf("%lld\n",ans[n]);
} return ;
}
官方题解是数位DP来写,数位DP其实就是记忆化搜索+深搜!建议学学!
【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)的更多相关文章
- 「赛后补题」HBCPC2018题目代码与思路简析
这次比赛(2018年第二届河北省大学生程序设计竞赛)虽然没有打,但是题目还是要写的.未完成的题目(还差比较硬核的四题)和思路分析会陆续更新完. Problem A 2011 Mex Query /* ...
- 2020.12.20vj补题
A - Insomnia cure 题意:一共s只龙,每隔k,l,m,n只龙就会受伤,问这s只龙有多少龙是受伤的 思路:看起来题目范围并不是很多,直接进行循环判断 代码: 1 #include< ...
- 【JOISC 2020 补题记录】
目录 Day 1 Building 4 Hamburg Steak Sweeping Day 2 Chameleon's Love Making Friends on Joitter is Fun R ...
- hdu5017:补题系列之西安网络赛1011
补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- 4.30-5.1cf补题
//yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...
- ICPC南京补题
由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...
- 第十届山东省acm省赛补题(1)
今天第一场个人训练赛的题目有点恐怖啊,我看了半个小时多硬是一道都不会写.我干脆就直接补题去了.... 先补的都是简单题,难题等我这周末慢慢来吧... A Calandar Time Limit: 1 ...
- CSP-S2019 赛前补题
前言 该打的比赛也打完了,每一场打得并不是很理想,所以就没写赛后总结了.最后再把每一场的比赛补一下,也算给自己一个交代吧. 牛客CSP-S提高组赛前集训营6 考试 100 + 30 + 0 = 130 ...
随机推荐
- Java中用FileInputStream和FileOutputStream读写txt文件,文件内容乱码的问题,另附循环代码小错误
乱码问题大概就是编码格式不一样,搜了很多都是这么说的,修改编码解决乱码问题链接: https://blog.csdn.net/weixin_42496466/article/details/81189 ...
- 通过 Spring Session 实现新一代的 Session 管理
长期以来,session 管理就是企业级 Java 中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原 ...
- 《Mysql 一条 SQL 更新语句是如何执行的?(Redo log)》
一:更新流程 - 对于更新来说,也同样会根据 SQL 的执行流程进行. - - 连接器 - 连接数据库,具体的不做赘述. - 查询缓存 - 在一个表上有更新的时候,跟这个表有关的查询缓存会失效. - ...
- 【51nod】1776 路径计数
[51nod]1776 路径计数 我们先把前两种数给排好,排好之后会有\(a + b + 1\)个空隙可以填数,我们计算有\(k\)个空隙两端都是相同字母的方案数 可以用枚举把第二种数分成几段插进去来 ...
- IP地址 子网掩码 网络地址 主机地址 广播地址
1.一定要明白各自的概念分别表示什么 IP地址:IP地址是用来识别网络上的设备,因此,IP地址是由网络地址与主机地址两部分所组成. 子网掩码:子网掩码不能单独存在,它必须结合IP地址一起使用.子网掩码 ...
- Linux (x86) Exploit 开发系列教程之二(整数溢出)
(1)漏洞代码 //vuln.c #include <stdio.h> #include <string.h> #include <stdlib.h> void s ...
- Python笔记008函数(2)
1. 昨日内容回顾: def 函数(): 函数体 return 值 如果不写return,默认返回None.可以单独返回一个值,也能够以元组的形式返回多个值.(不要把print和retu ...
- SAS学习笔记21 散点图、条形图
- MySQL 使用tee记录语句和输出日志
在mysql命令行中,使用tee命令,可以记录语句和输出到指定文件.在debugging时会很有用.每执行一条语句,mysql都会讲执行结果刷新到指定文件.Tee功能只在交互模式生效. mysql&g ...
- redis键的排序操作
命令名称:sort 语法:sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ ...