http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985

题意:给你0~k个数组合长度为n的字符串有多少种,这长度为n的字符串的子序列不能存在0~k的全排列。

题解:参考Kefault大牛博客:http://blog.csdn.net/knight_kaka/article/details/38616039

  1. 因为n很大,所以很容易想到要使用矩阵快速幂来加速。
  2. 那么接下来就是推导公式了。
  3. 我们定义dp[i][j]为长度为i,尾部j个字母均不相同的字符串的数目。
  4. 那么我们很容易推出dp[i][j]的递推公式了:
  5. dp[i][j]=dp[i-1][j-1]*(k-j+2)+dp[i-1][j]+……+dp[i-1][k];
  6. 这是什么意思呢?
  7. 首先我们知道,dp[i]和dp[i-1]只差一个字母,假设我们在dp[i-1]后面加上一个字母,这个
  8. 字母可以是和dp[i-1]尾部几个不同的字母中的一个相同,也可以不同(例:假如dp[i-1]=……0123,
  9. k=7,这是我们为了构成dp[i],我们可以在尾部加上4、5、6、7,或者0、1、2、3)
  10. 大家会发现如果是4、5、6、7,那么dp[i-1][j-1]就变成了dp[i][j](看定义),
  11. 如果是0、1、2、3,那么dp[i-1][j-1]就会相应变成dp[i][j],dp[i][j-1],dp[i][j-2],dp[i][j-3],
  12. 综上我们为了构成dp[i][j],就可以使用dp[i-1][j-1]---dp[i-1][k]来构造。
  13. 然后剩下的事就是构造矩阵了,很简单,不赘述。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long LL;
#define mod 20140518
int k;
struct Z{LL m[10][10];Z(){memset(m,0,sizeof(m));}void init(){//单位矩阵for(int i = 0;i < k;i++)m[i][i] = 1;}void Init(){//构造矩阵for(int i = 0;i < k;i++)for(int j = 0;j <=i ;j++)m[i][j] = 1;for(int i = 0;i < k-1;i++)m[i][i+1] = k - i;}
};
Z operator * (Z a, Z b){//矩阵乘法Z c;for(int i = 0;i < k;i++)for(int r = 0;r < k;r++)for(int j = 0;j < k;j++)c.m[i][j] = (c.m[i][j] + a.m[i][r]*b.m[r][j]) % mod;return c;
}
Z Pow(LL n){//快速幂Z ret,s;ret.init();s.Init();while(n){if(n&1) ret = ret * s;s = s * s;n >>= 1;}return ret;
}
int main(){int t,ca = 1;LL n;cin >> t;while(t--){cin >> n >> k;printf("Case #%d: ",ca++);Z ret;ret = Pow(n-1);LL ans = 0;for(int i = 0;i < k;i++)ans = (ans + ret.m[0][i] * (k+1)) % mod;cout << ans << endl;}
}

bnu- 34985 Elegant String相关推荐

  1. linux server文件,linux两台server远程copy文件

    hibernate笔记--组件映射方法 假设我们需要保存学生student的信息,student中有一个address属性,我们知道像这种信息其值可能会有多个,就像一个人会有两个以上的手机号,这种情况 ...

  2. 2014 北京邀请赛ABDHJ题解

    A. A Matrix 点击打开链接 构造,结论是从第一行開始往下产生一条曲线,使得这条区间最长且从上到下递减, #include <cstdio> #include <cstrin ...

  3. C++11 学习笔记(持续更新)

    今天是2021年的第一天,立个新年的第一个flag,要在1月1日~2月15日过一遍<C++ Primer Plus>和<Effective C++>,并做好笔记,写好blog, ...

  4. Java知识——精华总结

    Java知识--精华总结 一.java概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 为了使计算机能够理解人的意图,人类就必须 ...

  5. BNU OJ 第26303 题 Touchscreen Keyboard

    BNU OJ第26303题Touchscreen Keyboard(题目链接)的解题报告. 原题如下: Touchscreen Keyboard Problem Description Nowaday ...

  6. 第 16 章 string类和标准模板库

    第 16 章 string类和标准模板库 16.1 string类 C语言在 string.h(C++中为cstring)提供了一系列的字符串函数. 16.1.1 构造字符串 string 实际上是模 ...

  7. 【String类和标准模板库】

    1.string类 2.智能指针模板类 3.标准模板库 4.泛型编程 5.函数对象 6.算法 7.其他库 1.string类 string类是由头文件string支持的,要使用类,关键要知道它的公有接 ...

  8. 《C++ Primer Plus》学习笔记-string类和标准模板库

    第16章 string类和标准模板库(本书附录G有详细介绍) 16.1 string类 string类是由头文件string支持的. string类位于命名空间std中. ctor标识是传统C++中构 ...

  9. A. BNU ACM校队时间安排表

    ICPC,全称国际大学生程序设计竞赛,由美国计算机协会(ACM)主办.它是一项非常公平的比赛,广受世界各地大学生的喜爱.ACM每年在各大洲会举办区域赛,表现优异的学校将有资格参加世界总决赛. ACM- ...

最新文章

  1. php 自动返回,PHP实现自动识别Restful API的返回内容类型
  2. R使用dplyr包对变量、特征进行标准化(standardize)缩放操作
  3. 使用echo输出一绝对路径,使用egrep取出其基名
  4. test.php.bak,MongoDB热备份工具:解决官方版备份缺陷
  5. kd树介绍(KNN算法引出)
  6. unity3d中脚本生命周期(MonoBehaviour lifecycle)
  7. pytorch18种损失函数全详解
  8. 运营商取消不限量套餐 网友:这是变相涨价
  9. web前端工作笔记008---js延迟执行代码
  10. L1-028. 判断素数-PAT团体程序设计天梯赛GPLT
  11. swf -fla -swf
  12. 富士施乐 DocuCentre-V 3065 打印机远程命令执行漏洞
  13. java分布式框架-JDF
  14. H264解码器源码(Android 1.6 版)
  15. 中国越野车和皮卡市场趋势报告、技术动态创新及市场预测
  16. 数字孪生核电站促进界面监测的应用实践
  17. bug[TypeError:Failed to execute ‘fetch‘ on ‘Window‘: Request with GET/HEAD method cannot have body.]
  18. 21世纪NBA十大诡异数据
  19. 问题 A: 电路维修
  20. 三、ArcGIS河网提取

热门文章

  1. 神策数据携手百丽国际,专注品牌零售行业数字化未来
  2. 如何在Python3.x上安装Sentry,实时监控业务错误
  3. linux安全配置-将ssh服务隐藏于Internet(端口碰撞)
  4. C++的坑真的多吗?
  5. VMware vSphere虚拟化-VMware ESXi 5.5组件安装过程记录
  6. Mac下制作Ubuntu的启动U盘
  7. LINUX内核经典面试题
  8. windows 2003 配置dhcp服务器
  9. LIST OF CITIES FOR POTENTIAL VISIT IN SOUTHERN UK
  10. 论述一个模式的时候的方法