题目大意:有一种长度为$n(n\leqslant 10^{18})$的字符串,给定$m(m\leqslant10^3)$种限制,即字符$c$出现的次数为$cnt$,若一个字符有多种限制,则满足任意一个即可,求这种字符串有多少个,所有的$cnt$相乘小于等于 123,答案对 12345 取模。

题解:最多$6$个限制的$cnt\not=2$,状态只需要记录这些不为$1$的限制,可以把每个限制出现次数压成一个数,构建矩阵,快速幂即可

卡点:

C++ Code:

  1. #include <cstdio>
  2. #include <vector>
  3. #define maxn 1010
  4. const int mod = 12345;
  5. inline int min(int a, int b) {return a < b ? a : b;}
  6. inline int max(int a, int b) {return a > b ? a : b;}
  7. inline void up(int &a, int b) {if ((a += b) >= mod) a -= mod;}
  8. inline long long pw(long long base, long long p) {
  9. base %= mod;
  10. long long res = 1;
  11. for (; p; p >>= 1, base = base * base % mod) if (p & 1) res = res * base % mod;
  12. return res;
  13. }
  14.  
  15. int __sz = 1;
  16. struct matrix {
  17. #define __M 150
  18. #define M __sz
  19. int s[__M][__M];
  20. inline matrix() {
  21. __builtin_memset(s, 0, sizeof s);
  22. }
  23. inline friend matrix operator * (const matrix &lhs, const matrix &rhs) {
  24. matrix res;
  25. for (register int i = 0; i < M; i++) {
  26. for (register int j = 0; j < M; j++) {
  27. long long tmp = 0;
  28. for (register int k = 0; k < M; k++) tmp += static_cast<long long> (lhs.s[i][k]) * rhs.s[k][j];
  29. res.s[i][j] = tmp % mod;
  30. }
  31. }
  32. return res;
  33. }
  34. #undef __M
  35. #undef M
  36. } BASE, RES;
  37.  
  38. long long n;
  39. int m;
  40. int mp[300], ret[300], __name, prod[300];
  41. int base[300];
  42. std::vector<int> v[300];
  43. inline int get(int x, int i) {return x / base[i - 1] % prod[i];}
  44. inline bool check(int x) {
  45. for (int i = 1; i <= __name; i++) {
  46. bool find = false;
  47. int now = get(x, i);
  48. for (std::vector<int>::iterator it = v[i].begin(); it != v[i].end(); it++) if (now % *it == 0) {
  49. find = true;
  50. break;
  51. }
  52. if (!find) return false;
  53. }
  54. return true;
  55. }
  56.  
  57. int main() {
  58. scanf("%lld%d", &n, &m);
  59. for (int i = 1, x, ch; i <= m; i++) {
  60. char __ch;
  61. scanf("%1s%d", &__ch, &x); ch = static_cast<int>(__ch);
  62. if (!mp[ch]) mp[ch] = ++__name, ret[__name] = ch, prod[__name] = 1;
  63. prod[mp[ch]] *= x;
  64. v[mp[ch]].push_back(x);
  65. __sz *= x;
  66. }
  67. base[0] = 1; for (int i = 1; i <= __name; i++) base[i] = base[i - 1] * prod[i];
  68. for (int i = 0; i < __sz; i++) {
  69. for (int j = 1; j <= __name; j++) {
  70. int now = get(i, j), nxt = (now + 1) % prod[j];
  71. up(BASE.s[i][i + (nxt - now) * base[j - 1]], 1);
  72. }
  73. }
  74. RES.s[0][0] = 1;
  75. for (; n; n >>= 1, BASE = BASE * BASE) if (n & 1) RES = RES * BASE;
  76. int ans = 0;
  77. for (int i = 0; i < __sz; i++) if (check(i)) up(ans, RES.s[0][i]);
  78. printf("%d\n", ans);
  79. return 0;
  80. }

  

[CF107D]Crime Management的更多相关文章

  1. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  2. SQL Server Management Studio 无法修改表,超时时间已到 在操作完成之前超时时

    在修改表时,保存的时候显示:无法修改表,超时时间已到 在操作完成之前超时时间已过或服务器未响应 这是执行时间设置过短的原因,可以修改一下设置便能把执行时间加长,以便有足够的时间执行完修改动作. 在 S ...

  3. Java Business Process Management(业务流程管理) 初识环境搭建

    一.简介 (一)什么是jbpm JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易 ...

  4. Power Management开发的一般流程

    本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 开发流程 针对一个PM feature进行开发,设计模型是第一步.模型设计好之后,还要保留参数接口,可以基于这些参数针对特殊个体进行优化. ...

  5. sqlserver2008附加数据库时提示“无法为该请求检索数据。 (Microsoft.SqlServer.Management.Sdk.Sfc)”

    解决方案: 右击SQL Server Management Studio以管理员身份运行,选择与脱机数据库时相同的登陆方式(win还是sa),进入后再附加就是ok了.

  6. Information Management Policy(信息管理策略)的使用范例

    基础知识 很多人都会定期收拾自己的书架或者抽屉,把里面过旧的资料拿走,为新的资料腾出空间来,这样既可以节省空间,而且当冗余资料过多的时候也会降低你查找的速度和效率.那么,在企业的SharePoint中 ...

  7. 禁用SQL Server Management Studio的IntelliSense

    禁用SQL Server Management Studio的IntelliSense 本文版权归作者所有,未经作者同意不得转载.

  8. Policy Management

    策略管理用于管理数据库实例.数据库以及数据库对象的各种属性,Policy Management 位于Management Catalog下, 一,Basic concepts 引用园子里深蓝的博客&l ...

  9. 开源WinForms界面开发框架Management Studio 选项卡文档 插件 Office 2007蓝色风格 后台线程

    Management Studio是我在WinForms小项目开发过程中搭建起来的一个插件式结构的应用程序框架,因为简单灵活又容易扩展,现在将它开源供读者参考. 跑起来的效果图如下所示,具备选项卡式多 ...

随机推荐

  1. 实现php Curl 调用不同项目中方法

    之前为了实现跨项目调用方法,遇到的一些问题和解决方法总结. 话不多说,直接复制代码先跑了再说! jq代码. $.ajax({ type: "post", dataType: &qu ...

  2. 【linux下dhcp服务的简单搭建及优化部署】

    dhcp server: 1::vim /etc/sysconfig/network-scripts/ifcfg-scfg:配置 server的 static IP: 2:vim /etc/dhcpd ...

  3. Delphi 过程类型

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. HyperLedger Fabric 1.4 关键技术(6.4)

    本节介绍从最底层的账本开始,逐一讲解账本的结构和存储.智能合约的编写和部署.通道的操作.节点的背书和提交.排序的共识和客户端SDK的接口调用,与交易流程顺序相反,由里及表的说明Fabric最关键的技术 ...

  5. (数据科学学习手札13)K-medoids聚类算法原理简介&Python与R的实现

    前几篇我们较为详细地介绍了K-means聚类法的实现方法和具体实战,这种方法虽然快速高效,是大规模数据聚类分析中首选的方法,但是它也有一些短板,比如在数据集中有脏数据时,由于其对每一个类的准则函数为平 ...

  6. 剑指offer题目系列一

    本篇介绍<剑指offer>第二版中的四个题目:找出数组中重复的数字.二维数组中的查找.替换字符串中的空格.计算斐波那契数列第n项. 这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺 ...

  7. Druid时序数据库升级流程

    目前Druid集群版本为0.11.0,新版本0.12.1已支持Druid SQL和Redis,考虑到Druid新特性以及性能的提升,因此需要将Druid从0.11.0版本升级到0.12.1版本,下面将 ...

  8. P1346 电车(dijkstra)

    P1346 电车 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口 ...

  9. 数据迁移的应用场景与解决方案Hamal

    本文来自网易云社区 作者:马进 跑男热播,作为兄弟团忠实粉丝,笔者也是一到周五就如打鸡血乐不思蜀. 看着银幕中一众演员搞怪搞笑的浮夸演技,也时常感慨,这样一部看似简单真情流露的真人秀,必然饱含了许许多 ...

  10. kindeditor 限制上传图片大小及宽高

    进入:/kindeditor/plugins/image/image.js,替换其中的 self.plugin.imageDialog = function (options)方法,代码为: self ...