【好好补题,因为没准题目还会再出第三遍!!】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 ...
随机推荐
- CenOS 7 java链接redis数据库
完整代码 public class App { public static void main(String[] args) { System.out.println("Hello Worl ...
- eNSP——静态路由的基本配置
原理: 静态路由是指用户或网络管理员手工配置的路由信息.当网络的拓扑结构或链路状态发生改变时,需要网络管理人员手工修改静态路由信息. 相比于动态路由协议,静态路由无需频繁地交换各自的路由表,配置简单, ...
- Python学习路线图(2020年最新版)
这是我刚开始学习python时的一套学习路线,从入门到上手.(不敢说精通,哈哈~) 希望对大家有帮助哈~ 一.Python入门.环境搭建.变量.数据类型 二.Python运算符.条件结构.循环结构 三 ...
- 记一次Spring Cloud压力测试
前言 公司打算举办一场活动,现场参与活动人数比较多.针对于可能访问比较密集的接口进行压力测试.使用jmeter进行测试,请求并发稍微多些,系统就会挂起. 针对压力测试出现的问题,因为并发超过1秒钟10 ...
- c# 面向对象/继承关系设计
继承 RTTI RTTI 概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. ...
- 前后端分离,如何防止api接口被恶意调用或攻击
无论网站,还是App目前基本都是基于api接口模式的开发,那么api的安全就尤为重要了.目前攻击最常见的就是“短信轰炸机”,由于短信接口验证是App,网站检验用户手机号最真实的途径,使用短信验证码在提 ...
- unicode 格式 转汉字
function decodeUnicode($str){ return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', create_function( ...
- mysql 行(记录)的详细操作
阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...
- JVM OOM异常会导致JVM退出吗?
出处: https://mp.weixin.qq.com/s/8j8YTcr2qhVActLGzOqe7Q https://blog.csdn.net/h2604396739/article/de ...
- Scratch 母鸡保护鸡蛋
今天我们一起实现一个“母鸡保护鸡蛋”的小游戏 具体思路是这样滴: 1.鸡蛋会不断的从右往左移动: 2.当母鸡快碰到鸡蛋的时候,按下“空格键”让母鸡跳跃起来: 3.如果母鸡落下没碰到鸡蛋,加一分: 4. ...