P1357 花园 (矩阵快速幂+ DP)
题意:一个只含字母C和P的环形串
求长度为n且每m个连续字符不含有超过k个C的方案数
m <= 5 n <= 1e15
题解:用一个m位二进制表示状态 转移很好想
但是这个题是用矩阵快速幂加速dp的 因为每一位的转移都是一样的
用一个矩阵表示状态i能否转移到状态j 然后跑一遍
统计答案特别讲究 因为是一个环 从1 ~ n+m
那么 m+1 ~ n + m之间就是我们所求的 1 ~ m和n+1 ~ n + m是同样的一段
就相当于把m位二进制状态 转移n次
然后再转移到自己的就是答案
初试模板题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + ; ll n, m, k, len;
struct node {
ll c[][];
}re, x; bool check(int x) {
int cnt = ;
while(x) {
if(x & ) cnt++;
x >>= ;
}
if(cnt > k) return false;
return true;
} node mul(node a, node b) {
node res;
memset(res.c, , sizeof(res.c)); for(int i = ; i < len; i++)
for(int j = ; j < len; j++)
for(int k = ; k < len; k++)
res.c[i][j] = (res.c[i][j] + a.c[i][k] * b.c[k][j] % mod) % mod;
return res;
} node pow_mod(node x, ll y) {
node res;
for(int i = ; i < len; i++) res.c[i][i] = ; while(y) {
if(y & ) res = mul(res, x);
x = mul(x, x);
y >>= ;
}
return res;
} int main() {
scanf("%lld%lld%lld", &n, &m, &k);
len = ( << m);
for(int i = ; i < len; i++)
for(int j = ; j < len; j++)
x.c[i][j] = ; for(int i = ; i < len; i++) {
if(!check(i)) continue;
int tmp = i;
int ctmp = << (m - );
if((tmp & ctmp) == ctmp) tmp -= ctmp;
tmp <<= ;
if(check(tmp)) x.c[i][tmp] = ;
tmp |= ;
if(check(tmp)) x.c[i][tmp] = ;
}
re = pow_mod(x, n); ll ans = ;
for(int i = ; i < len; i++) {
if(check(i)) {
ans += re.c[i][i];
ans %= mod;
}
}
printf("%lld\n", ans);
return ;
}
P1357 花园 (矩阵快速幂+ DP)的更多相关文章
- codeforces 691E 矩阵快速幂+dp
传送门:https://codeforces.com/contest/691/problem/E 题意:给定长度为n的序列,从序列中选择k个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二 ...
- BZOJ1009 矩阵快速幂+DP+KMP
Problem 1009. -- [HNOI2008]GT考试 1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: ...
- Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...
- COJ 1208 矩阵快速幂DP
题目大意: f(i) 是一个斐波那契数列 , 求sum(f(i)^k)的总和 由于n极大,所以考虑矩阵快速幂加速 我们要求解最后的sum[n] 首先我们需要思考 sum[n] = sum[n-1] + ...
- Codeforces 954 dijsktra 离散化矩阵快速幂DP 前缀和二分check
A B C D 给你一个联通图 给定S,T 要求你加一条边使得ST的最短距离不会减少 问你有多少种方法 因为N<=1000 所以N^2枚举边数 迪杰斯特拉两次 求出Sdis 和 Tdis 如果d ...
- Codeforces 989E A Trance of Nightfall 矩阵快速幂+DP
题意:二维平面上右一点集$S$,共$n$个元素,开始位于平面上任意点$P$,$P$不一定属于$S$,每次操作为选一条至少包含$S$中两个元素和当前位置$P$的直线,每条直线选取概率相同,同一直线上每个 ...
- BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)
题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...
- bzoj2004 矩阵快速幂优化状压dp
https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...
- [luogu1357] 花园 [dp+矩阵快速幂]
题面: 传送门 思路: 把P形花圃记录为0,C形记录为1,那么一段花圃就可以状态压缩成一个整数 那么,我们可以有这样的状压dp: dp[i][S]表示前i个花圃,最后m个的状态为S的情况 如果这是一条 ...
随机推荐
- POJ 1737 经典DP
问题:求含有n个点的连通图的个数. 解: 考虑DP,$f(n)$表示n个点,每个点都和点1相连,且n个点互相连通的图的个数. (蓝字非常重要,这个条件有效地避免了重复计算) $g(n)$表示n个点,每 ...
- Windows下允许redis远程访问
1.安装很简单,下载安装包安装即可,略过: 下载msi的安装包,会自动安装进服务: 2.远程访问 Redis默认只允许本地访问,要使Redis可以远程访问,需修改配置文件: 我用的redis3.2 , ...
- git stash和git stash pop(转载)
转自:http://www.cnblogs.com/highriver/archive/2012/01/05/2313808.html zz: http://blog.csdn.net/herbert ...
- 笔记-JavaWeb学习之旅3
数据库的设计 1.多表之间的关系 一对一 一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键 一对多 在多的一方建立外键指向一的一方建立主键 多对多 多对多关系实现需要借助第三张中间表.中间表 ...
- iOS 更改通知栏为白色
1.在 info.plist 中添加View controller-based status bar appearance,值为NO. 2.在设置状态栏的地方添加代码: UIApplication.s ...
- spring cloud feign 调用接口报错"No message available
There was an unexpected error (type=Internal Server Error, status=500). status 404 reading HelloServ ...
- 浅谈算法——KMP
KMP是啥?KMP当然是KMPlayer的简称啦 KMP算法是用来解决字符串匹配的一种算法,由D.E.Knuth.J.H.Morris和V.R.Pratt同时发现,然后它可以用来干啥呢?我们上个例题: ...
- SPRING-BOOT系列之Spring4快速入门
上节 : spring boot简介 接着上章节的spring boot简介,我们会发现boot是基于spring的,其中最重要的就是spring容器了.那么本章着重介绍spring容器装配自定义be ...
- Hadoop工作流--JobControl(五)
不多说,直接上干货! 这只是部分,做个引子. 未完,待续!
- AJPFX总结方法的特点
它可以实现独立的功能; 必须定义在类里面; 它只有被调用才会执行; 它可以被重复使用; 方法结束后方法里的对象失去引用; 如何定义一个功能,并通过方法体现出来: ① 明确该功能运算后的结果.明确返 ...