题意:一个只含字母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)的更多相关文章

  1. codeforces 691E 矩阵快速幂+dp

    传送门:https://codeforces.com/contest/691/problem/E 题意:给定长度为n的序列,从序列中选择k个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二 ...

  2. BZOJ1009 矩阵快速幂+DP+KMP

    Problem 1009. -- [HNOI2008]GT考试 1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: ...

  3. Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP

    题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...

  4. COJ 1208 矩阵快速幂DP

    题目大意: f(i) 是一个斐波那契数列 , 求sum(f(i)^k)的总和 由于n极大,所以考虑矩阵快速幂加速 我们要求解最后的sum[n] 首先我们需要思考 sum[n] = sum[n-1] + ...

  5. Codeforces 954 dijsktra 离散化矩阵快速幂DP 前缀和二分check

    A B C D 给你一个联通图 给定S,T 要求你加一条边使得ST的最短距离不会减少 问你有多少种方法 因为N<=1000 所以N^2枚举边数 迪杰斯特拉两次 求出Sdis 和 Tdis 如果d ...

  6. Codeforces 989E A Trance of Nightfall 矩阵快速幂+DP

    题意:二维平面上右一点集$S$,共$n$个元素,开始位于平面上任意点$P$,$P$不一定属于$S$,每次操作为选一条至少包含$S$中两个元素和当前位置$P$的直线,每条直线选取概率相同,同一直线上每个 ...

  7. BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)

    题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...

  8. bzoj2004 矩阵快速幂优化状压dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...

  9. [luogu1357] 花园 [dp+矩阵快速幂]

    题面: 传送门 思路: 把P形花圃记录为0,C形记录为1,那么一段花圃就可以状态压缩成一个整数 那么,我们可以有这样的状压dp: dp[i][S]表示前i个花圃,最后m个的状态为S的情况 如果这是一条 ...

随机推荐

  1. 6-13 Hog特征1

    Hog特征与Haar特征有点不同,Hog特征是直接经过模板计算得到的

  2. 开源一个基于dotnet standard的轻量级的ORM框架-Light.Data

    还在dotnet framework 2.0的时代,当时还没有EF,而NHibernate之类的又太复杂,并且自己也有一些特殊需求,如查询结果直接入表.水平分表和新增数据默认值等,就试着折腾个轻量点O ...

  3. “玲珑杯”线上赛 Round #17 河南专场 A: Sin your life(和化积公式)

    传送门 题意 略 分析 首先将sin(x)+sin(y)+sin(z)h转化成\(2*sin(\frac{x+y}2)*cos(\frac{x-y}2)+sin(z)\),而cos(z)=cos(-z ...

  4. bzoj 1076: [SCOI2008]奖励关【状压dp+概率dp】

    设f[i][s]为前i步,选的礼物集合为s的方案数,然而并不会转移-- 看了hzwer的blog,发现要倒着转移,然后答案就是f[1][0] 妙啊 #include<iostream> # ...

  5. bzoj1257[CQOI2007]余数之和(除法分块)

    1257: [CQOI2007]余数之和 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 6117  Solved: 2949[Submit][Statu ...

  6. 揭开Python科学计算的面纱

    春牛春杖.无限春风来海上.便与春工.染得桃红似肉红. 春幡春胜.一阵春风吹酒醒.不似天涯.卷起杨花似雪花. 标准的Python中用列表保存一组值,可以当做数组使用,但是由于其值类型任意,所以列表中保存 ...

  7. python之os、sys和random模块

    import os # print(os.getcwd())#获取当前目录,绝对路径# print(os.chdir('../'))#更改当前目录,../的意思是退回上一级目录# print(os.g ...

  8. AtCoder Grand Contest 005 C - Tree Restoring

    题目传送门:https://agc005.contest.atcoder.jp/tasks/agc005_c 题目大意: 给定一个长度为\(N\)的整数序列\(A_i\),问能否构造一个\(N\)个节 ...

  9. Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) A

    Description Bear Limak wants to become the largest of bears, or at least to become larger than his b ...

  10. 模拟 百度之星资格赛 1003 IP聚合

    题目传送门 /* 模拟水题,排序后找出重复的ip就可以了 */ #include <cstdio> #include <iostream> #include <algor ...