[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]\)。

代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define N 105
  4. using namespace std;
  5. 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;}
  6. const ll mod=1e9+7;
  7. int n;
  8. char s[N];
  9. int f[N][N];
  10. int c[N][N];
  11. int Mod(int a) {return a<0?a+mod:(a<mod?a:a-mod);}
  12. int g[N][2];
  13. int ans;
  14. void update(int v,int sn,int flag,int sum) {
  15. if(s[sn]=='<') {
  16. for(int j=1;j<=sum;j++) g[j][flag]=Mod(g[j-1][flag]+f[sn][j-1]);
  17. } else {
  18. for(int j=sum;j>=1;j--) g[j][flag]=Mod(g[j+1][flag]+f[sn][j+1]);
  19. }
  20. }
  21. int work(int sum) {
  22. memset(f,0,sizeof(f));
  23. for(int i=n;i>=1;i--) {
  24. memset(g,0,sizeof(g));
  25. if(i*2<=n) update(i,i<<1,0,sum);
  26. else for(int j=1;j<=sum;j++) g[j][0]=1;
  27. if(i*2+1<=n) update(i,i<<1|1,1,sum);
  28. else for(int j=1;j<=sum;j++) g[j][1]=1;
  29. for(int j=1;j<=sum;j++) f[i][j]=1ll*g[j][0]*g[j][1]%mod;
  30. }
  31. int ans=0;
  32. for(int i=1;i<=sum;i++) ans=Mod(ans+f[1][i]);
  33. return ans;
  34. }
  35. int main() {
  36. n=Get();
  37. for(int i=0;i<=n;i++)
  38. for(int j=0;j<=i;j++)
  39. c[i][j]=(!j||i==j)?1:Mod(c[i-1][j-1]+c[i-1][j]);
  40. scanf("%s",s+2);
  41. int flag=1;
  42. for(int i=n;i>=1;i--,flag*=-1) {
  43. ans=(ans+flag*1ll*c[n][i]*work(i)%mod+mod)%mod;
  44. }
  45. cout<<ans;
  46. return 0;
  47. }

[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. WPF Grid布局

    本节讲述布局,顺带加点样式给大家看看~单纯学布局,肯定是枯燥的~哈哈 那如上界面,该如何设计呢? 1.一些布局元素经常用到.Grid StackPanel Canvas WrapPanel等.如上这种 ...

  2. JAVA & .NET创建对象构造函数调用顺序

    JAVA 定义Person类 package models; ​ public class Person { public Person() { System.out.println("pe ...

  3. Eclipse中SVN插件的安装和配置(在线安装)

    公司项目中用到了svn来管理项目,然后需要在Eclipse中进行配置.网上参考了很多资料,离线安装的方式装上了,但是导入项目后报错,可能是离线安装包的问题.然后又采用了Eclipse在线安装的方式,总 ...

  4. springboot整合netty(二)

    目录 前言 正文 代码 1. 新建一个springboot项目,在pom文件中添加netty依赖: 2.新建netty服务 3.netty调用所需的服务类 4 springboot启动类 5.测试 我 ...

  5. 预览github代码

    方法一:最简单的方法,在代码的url前面加上: http://htmlpreview.github.com/? 方法二: 使用Githubpages, 方法一有可能会修改css样式,不过方法二略复杂, ...

  6. Could not open input file: artisan 【Laravel初体验】

    1,情景描述:在命令行窗口写入php artisan make:model Models\MenuModel用于创建模型时,出现此错误(Could not open input file: artis ...

  7. 读书笔记--Android Gradle权威指南(上)

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...

  8. 09-HTML-form标签

    <html> <head>  <title>form标签学习</title>  <meta charset="utf-8"/& ...

  9. php对二维数据排序

    对于一维数组排序比较简单,像使用sort(),asort(),arsort()等函数进行排序,但是对于二维数组比较麻烦,所有借鉴网上的总结了一下 // 对二维数组进行指定key排序 $arr 二维数组 ...

  10. [CSS] Transitions动画效果(1)

    Transitions动画效果(1) 源码 https://github.com/YouXianMing/CSS-Animations/tree/master/Transitions 效果 细节