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

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

卡点:无

C++ Code:

#include <cstdio>
#include <vector>
#define maxn 1010
const int mod = 12345;
inline int min(int a, int b) {return a < b ? a : b;}
inline int max(int a, int b) {return a > b ? a : b;}
inline void up(int &a, int b) {if ((a += b) >= mod) a -= mod;}
inline long long pw(long long base, long long p) {
base %= mod;
long long res = 1;
for (; p; p >>= 1, base = base * base % mod) if (p & 1) res = res * base % mod;
return res;
} int __sz = 1;
struct matrix {
#define __M 150
#define M __sz
int s[__M][__M];
inline matrix() {
__builtin_memset(s, 0, sizeof s);
}
inline friend matrix operator * (const matrix &lhs, const matrix &rhs) {
matrix res;
for (register int i = 0; i < M; i++) {
for (register int j = 0; j < M; j++) {
long long tmp = 0;
for (register int k = 0; k < M; k++) tmp += static_cast<long long> (lhs.s[i][k]) * rhs.s[k][j];
res.s[i][j] = tmp % mod;
}
}
return res;
}
#undef __M
#undef M
} BASE, RES; long long n;
int m;
int mp[300], ret[300], __name, prod[300];
int base[300];
std::vector<int> v[300];
inline int get(int x, int i) {return x / base[i - 1] % prod[i];}
inline bool check(int x) {
for (int i = 1; i <= __name; i++) {
bool find = false;
int now = get(x, i);
for (std::vector<int>::iterator it = v[i].begin(); it != v[i].end(); it++) if (now % *it == 0) {
find = true;
break;
}
if (!find) return false;
}
return true;
} int main() {
scanf("%lld%d", &n, &m);
for (int i = 1, x, ch; i <= m; i++) {
char __ch;
scanf("%1s%d", &__ch, &x); ch = static_cast<int>(__ch);
if (!mp[ch]) mp[ch] = ++__name, ret[__name] = ch, prod[__name] = 1;
prod[mp[ch]] *= x;
v[mp[ch]].push_back(x);
__sz *= x;
}
base[0] = 1; for (int i = 1; i <= __name; i++) base[i] = base[i - 1] * prod[i];
for (int i = 0; i < __sz; i++) {
for (int j = 1; j <= __name; j++) {
int now = get(i, j), nxt = (now + 1) % prod[j];
up(BASE.s[i][i + (nxt - now) * base[j - 1]], 1);
}
}
RES.s[0][0] = 1;
for (; n; n >>= 1, BASE = BASE * BASE) if (n & 1) RES = RES * BASE;
int ans = 0;
for (int i = 0; i < __sz; i++) if (check(i)) up(ans, RES.s[0][i]);
printf("%d\n", ans);
return 0;
}

  

[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. js实现前端的搜索历史记录

    最近在对接前台页面(WEB端)时,产品要求需记录下客户的搜索记录,我们是前后台完全分离的项目,根本不能保存的session域中,没办法,虽然作为后台开发,遇到需求就自己研究了一通,先看一下最终效果图, ...

  2. 微信中h5页面用window.history.go(-1)返回上一页页面不会重新加载问题

    问题描述: 在实际开发中遇到这样一个问题,业务需求涉及到返回上一页问题,第一时间想到了window.history.go(-1)方法,这样做本身没有任何问题,但是在微信中,安卓手机还好返回上一页页面会 ...

  3. Linux基础(02)、MTPutty安装和使用

    准备工具 1. MTPutty的安装包 2. Putty.exe程序 作用:远程连接操作Centos 安装MTPutty 1.根据提示,一直下一步至下图:选择putty.exe文件的位置即可. 2.选 ...

  4. 8.1 编写USB鼠标驱动程序,并测试

    学习目标:编写USB鼠标驱动程序,并测试(将USB鼠标的左键当作L按键,将USB鼠标的右键当作S按键,中键当作回车按键). 一.怎么写USB设备驱动程序?步骤如下: 1. 首先先定义全局变量usb_d ...

  5. codeforces 845A Chess Tourney

    参考:https://blog.csdn.net/zhongyuchen/article/details/77478039 #include <iostream> #include < ...

  6. 动态规划(DP)算法

    参考https://blog.csdn.net/libosbo/article/details/80038549 动态规划是求解决策过程最优化的数学方法.利用各个阶段之间的关系,逐个求解,最终求得全局 ...

  7. 最短路径问题 3.Bellman-Ford算法

    简要:Bellman-Ford算法计算的仍然是从一个点到其他所有点的最短路径算法,其时间复杂度是O(NE),N表示点数,E表示边数,不难看出,当一个图稍微稠密一点,边的数量会超过点数那么实际上效率是低 ...

  8. Spark Streaming实时处理应用

    1 框架一览   事件处理的架构图如下所示. 2 优化总结   当我们第一次部署整个方案时,kafka和flume组件都执行得非常好,但是spark streaming应用需要花费4-8分钟来处理单个 ...

  9. 开启一个项目如何上传到git

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  10. C++11中std::bind的使用

    std::bind: Each argument may either be bound to a value or be a placeholder: (1).If bound to a value ...