ACM字符串
.长度不能超过n
.字符串中仅包含大写字母
.生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 输入一个正整数T,代表有T组数据
接下来T行,每行一个正整数n,n<=。 输出 输出符合条件的字符串的数目 样例输入 样例输出

做题过程:

  1. 熬了三四个小时,WA了无数次!最终推出了组合数的公式!
  2. 首先暴力打表,嘿嘿!这样极大地压缩计算时间!
  3. 打表如下:

    一:生成连续的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 ;
    }
  4. 二:开始进行组合数学处理,并且处理误差!

  5. 误差是怎么回事呢?举个栗子当“n=6时,形如当只含有一个ACM时—— “ACM_ _ _”这种样子C(4,1)种组合数(把ACM捆绑成一块!),然后需要C(4,1) 乘于其余三个空位上的数字组合,这三种数字“因为不能再含有ACM”直接调用上面求出的Els[3], 但是这里存在了误差!
  6. 仔细考虑一下,当出现“_ACM_ _”的组合的这种情况时,其实有Els[1]*Els[2] 种!也就是说中间的“ACM”隔开了两边,我上面求的那么“Els”的真实意思是“生成连续的7位绝对不含ACM的数据个数”!Els[1]*Els[2] -Els[3] = 1 ,这里的误差就是1!以此类推!
  7. 同理,其他的情况也是如此!多的位数可以跑循环进行枚举!手写就有点麻烦了!
#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来写)的更多相关文章

  1. 「赛后补题」HBCPC2018题目代码与思路简析

    这次比赛(2018年第二届河北省大学生程序设计竞赛)虽然没有打,但是题目还是要写的.未完成的题目(还差比较硬核的四题)和思路分析会陆续更新完. Problem A 2011 Mex Query /* ...

  2. 2020.12.20vj补题

    A - Insomnia cure 题意:一共s只龙,每隔k,l,m,n只龙就会受伤,问这s只龙有多少龙是受伤的 思路:看起来题目范围并不是很多,直接进行循环判断 代码: 1 #include< ...

  3. 【JOISC 2020 补题记录】

    目录 Day 1 Building 4 Hamburg Steak Sweeping Day 2 Chameleon's Love Making Friends on Joitter is Fun R ...

  4. hdu5017:补题系列之西安网络赛1011

    补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...

  5. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  6. 4.30-5.1cf补题

    //yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...

  7. ICPC南京补题

    由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...

  8. 第十届山东省acm省赛补题(1)

    今天第一场个人训练赛的题目有点恐怖啊,我看了半个小时多硬是一道都不会写.我干脆就直接补题去了.... 先补的都是简单题,难题等我这周末慢慢来吧... A Calandar Time Limit: 1 ...

  9. CSP-S2019 赛前补题

    前言 该打的比赛也打完了,每一场打得并不是很理想,所以就没写赛后总结了.最后再把每一场的比赛补一下,也算给自己一个交代吧. 牛客CSP-S提高组赛前集训营6 考试 100 + 30 + 0 = 130 ...

随机推荐

  1. CF C.Ivan the Fool and the Probability Theory【思维·构造】

    题目传送门 题目大意: 一个$n*m$的网格图,每个格子可以染黑色.白色,问每个格子最多有一个相邻格子颜色相同的涂色方案数$n,m<=1e5$ 分析: 首先,考虑到如果有两个相邻的格子颜色相同, ...

  2. 【VS开发】fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本

    fatal error C1853: "Debug\sift.pch"预编译头文件来自编译器的早期版本 <pre id="best-content-12991040 ...

  3. csu 1770: 按钮控制彩灯实验

    1770: 按钮控制彩灯实验 Submit Page   Summary   Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 341 ...

  4. MySQL(二) decimal数据默认处理

    create table decimal_test(id int auto_increment PRIMARY key,score decimal(5,2) -- 取值范围是 -999.99 到 99 ...

  5. sql server 日期函数

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  6. Spring AOP 简介(三)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  7. 消息中间件——RocketMQ(一) 环境搭建(完整版)

    每章一点正能量:每当你想要放弃的时候,就想想是为了什么才一路坚持到现在. 前言 最近在回顾复习Java基础中的一些知识点,发现了一些以前见过但是没有留意却特别有意思的知识特性,比如这次想分享的Java ...

  8. IDEA使用 maven 搭建 SSM 框架

    文章目录 pom 文件的编写 项目结构 SSM 配置文件的编写 web.xml 的配置 总结 公司有个小的内部使用的软件,让开发,自己选择使用 SSM :因为之前自己学过,本以为一切水到渠成,但是好久 ...

  9. Python习题004

    作业一:三迁举办选“帅气男孩”,评委打分可以输入打分,要求分数必须大于5,小于10: 方法一 i = 1 while i < 6: score = input("请%d评委打分:&qu ...

  10. EXIT(外部中断)控制实验

    实验目的 设计使用外接的按键来作为触发源,使得控制器产生中断,并在中断服务函数中实现控制小灯的亮灭. 按键硬件点路 编程要点 初始化用来产生中断的 GPIO: 初始化 EXTI: 配置 NVIC: 编 ...