[CQOI2017]老C的键盘

题目描述

额,网上题解好像都是用的一大堆组合数,然而我懒得推公式。

设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数。

转移:

\[f[i][j]=\sum f[sn_1][k]*f[sn_2][q]
\]

需要判断一下\(k,q\)与\(j\)的关系满不满足题意就行了。

但是这样的答案显然不对,因为有些权值可能多次出现。

换句话说,有些权值可能没有出现。所以我们就用那个经典的容斥,枚举颜色数上界。

设\(g[s]\)表示颜色数最多为\(s\)的方案数,则\(\displaystyle ans=\sum_{s=1}^n (-1)^{n-s}C_n^sg[s]\)。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 105 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} const ll mod=1e9+7;
int n;
char s[N];
int f[N][N];
int c[N][N];
int Mod(int a) {return a<0?a+mod:(a<mod?a:a-mod);} int g[N][2];
int ans;
void update(int v,int sn,int flag,int sum) {
if(s[sn]=='<') {
for(int j=1;j<=sum;j++) g[j][flag]=Mod(g[j-1][flag]+f[sn][j-1]);
} else {
for(int j=sum;j>=1;j--) g[j][flag]=Mod(g[j+1][flag]+f[sn][j+1]);
}
}
int work(int sum) {
memset(f,0,sizeof(f));
for(int i=n;i>=1;i--) {
memset(g,0,sizeof(g));
if(i*2<=n) update(i,i<<1,0,sum);
else for(int j=1;j<=sum;j++) g[j][0]=1;
if(i*2+1<=n) update(i,i<<1|1,1,sum);
else for(int j=1;j<=sum;j++) g[j][1]=1;
for(int j=1;j<=sum;j++) f[i][j]=1ll*g[j][0]*g[j][1]%mod;
}
int ans=0;
for(int i=1;i<=sum;i++) ans=Mod(ans+f[1][i]);
return ans;
}
int main() {
n=Get();
for(int i=0;i<=n;i++)
for(int j=0;j<=i;j++)
c[i][j]=(!j||i==j)?1:Mod(c[i-1][j-1]+c[i-1][j]);
scanf("%s",s+2);
int flag=1;
for(int i=n;i>=1;i--,flag*=-1) {
ans=(ans+flag*1ll*c[n][i]*work(i)%mod+mod)%mod;
}
cout<<ans;
return 0;
}

[CQOI2017]老C的键盘的更多相关文章

  1. [BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数

    4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 218  Solved: 171[Submit][Statu ...

  2. [BZOJ4824][CQOI2017]老C的键盘(树形DP)

    4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 193  Solved: 149[Submit][Statu ...

  3. bzoj 4824: [Cqoi2017]老C的键盘

    Description 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...

  4. [bzoj4824][Cqoi2017]老C的键盘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...

  5. [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘

    Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...

  6. Luogu P3757 [CQOI2017]老C的键盘

    题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...

  7. 洛谷 P3757 [CQOI2017]老C的键盘

    题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...

  8. BZOJ3167/BZOJ4824 HEOI2013SAO/CQOI2017老C的键盘(树形dp)

    前者是后者各方面的强化版. 容易想到设f[i][j]表示i子树中第j小的是i的方案数(即只考虑相对关系).比较麻烦的在于转移.考虑逐个合并子树.容易想到枚举根原来的排名和子树根原来的排名,算一发组合数 ...

  9. 【题解】CQOI2017老C的键盘

    建议大家还是不要阅读此文了,因为我觉得这题我的解法实在是又不高效又不优美……只是想要记录一下,毕竟是除了中国象棋之外自己做出的组合dp第一题~ 首先如果做题做得多,比较熟练的话,应该能一眼看出这题所给 ...

随机推荐

  1. 依然是关于我空间那篇申请的日志《JavaScript axError:Unexpected token ILLEGAL 很简单的代码……》

    接下来要讲的日志现在的标题已经更改为<很简单的代码,但是无法--> 这篇日志地址:http://www.cnblogs.com/herbertchina/p/4475092.html 经过 ...

  2. C#文件夹权限操作整理

    using System.Security.AccessControl; using System.IO; using System.Security.Principal; 取得目录的访问控制和审核安 ...

  3. 1.Linux电源管理-休眠与唤醒

    1.休眠方式 在内核中,休眠方式有很多种,可以通过下面命令查看 # cat /sys/power/state //来得到内核支持哪几种休眠方式. 常用的休眠方式有freeze,standby, mem ...

  4. Java IO(2)阻塞式输入输出(BIO)

    在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...

  5. WPF中在XAML中实现数据类型转换的两种方法

    熟悉数据绑定的朋友都知道,当我们在Model中获取一个对象的数据,常常需要对其进行数据转换后显示在UI界面上,比如你用bool类型存储了一个人的性别,但是在界面上却需要经过转化后显示为男或女: 今天又 ...

  6. EJS-初识

    项目中使用了EJS,因此,也开始接触了EJS. EJS官方定义:it's just plain JavaScript. 总的来说,上手较快(毕竟我是个菜鸟). 第一步:安装: 第二部使用: 在html ...

  7. vim编辑器的设置

    1.vim编辑器设置分为两种设置,临时设置和永久设置 2.临时设置开启和关闭高亮模式(目前高亮模式是开启的) etc/ man.config vim man.config 在文本编辑器中命令行模式下输 ...

  8. JS之onunload、onbeforeunload事件详解

    简介 onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过 window.onunload来调用.区别在于onbeforeunload在o ...

  9. HTML DOM classList 属性

    页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋予了某个CSS类. 添加 ...

  10. MaltReport2:通用文档生成引擎

    UPDATED: 本文仅适用 MaltReport 2.x ,3.x 版本文档还在撰写当中,目前请参考项目中的 Samples. MaltReport 是我几年前写的开源单据.报表引擎,最近进行了较大 ...