COJ 1208 矩阵快速幂DP】的更多相关文章

题目大意: f(i) 是一个斐波那契数列 , 求sum(f(i)^k)的总和 由于n极大,所以考虑矩阵快速幂加速 我们要求解最后的sum[n] 首先我们需要思考 sum[n] = sum[n-1] + f(i+1)^k 那么很显然sum[n-1]是矩阵中的一个元素块 那么f(i+1)^k怎么利用f(i) , f(i-1)来求 f(i+1)^k = (f(i) + f(i-1)) ^ k 假如k = 1 , 可以看出f(i+1) = f(i-1) + f(i) (1,1) k = 2 , 可以看出…
传送门:https://codeforces.com/contest/691/problem/E 题意:给定长度为n的序列,从序列中选择k个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二进制中1的个数是3的倍数.问长度为k的满足条件的序列有多少种? 题解:dp状态定义为,在前i个数中以aj为结尾的方案数量 则转移为 因为是求和的转移,可以用矩阵快速幂将O(n)的求和加速为log级别 接下来的问题就是然后填系数了,因为要累加,所以只要时,我们将矩阵的第i行第j列的系数填为1即可 目的…
题意:一个只含字母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次 然后再转移到自己的就是答案 初试模板…
Problem 1009. -- [HNOI2008]GT考试 1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3773  Solved: 2314[Submit][Status][Discuss] Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0<=Ai<=9)…
题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$d_i$由小到大排序 设$f_i$表示加上$1\sim i-1$的所有边走$d_i$次后各点间的联通情况 $G$表示只连$1\sim i-1$的边的邻接矩阵 这些我们可以用一个$01$邻接矩阵来存储 则有 $f_i=f_{i-1}*G^{d_i-d_{i-1}}$ 这很明显是一个矩阵快速幂的过程 之…
A B C D 给你一个联通图 给定S,T 要求你加一条边使得ST的最短距离不会减少 问你有多少种方法 因为N<=1000 所以N^2枚举边数 迪杰斯特拉两次 求出Sdis 和 Tdis 如果dis[i]+dis[j]+1>=distance(s,t)&&dis[j]+dis[i]+1>=distance(i,j)就为一条要求边 #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) me…
题意:二维平面上右一点集$S$,共$n$个元素,开始位于平面上任意点$P$,$P$不一定属于$S$,每次操作为选一条至少包含$S$中两个元素和当前位置$P$的直线,每条直线选取概率相同,同一直线上每个点$Q \in S$ 选取概率相同,$Q$次询问 包含两个元素$t,m$ 即点$P$到$t$共操作$m$次的最大概率 打了场$CF$ 结果$D$题死活调不出来 只能一大早来补题了 可以想到记录$f[i][j][k]$表示从点$i$到点$j$走$k$步的概率 这个过程我们可以通过记录$2^x$的矩阵来…
题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以可以用矩阵加速 #include <bits/stdc++.h> using namespace std; int n, m, mod; ]; ]; struct node { ][]; }a, re; node mul(node x, node y) { node res; memset(res…
https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z所在的城市有N个公交车站,排列在一条长(N-)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计线路: .设共K辆公交车,则1到K号站作为始发站,N-K+1到N号台作为终点站. .每个车站必须被一辆且仅一辆公交…
由于方块最多涉及3行,于是考虑将每两行状压起来,dfs搜索每种状态之间的转移. 这样一共有2^12种状态,显然进行矩阵快速幂优化时会超时,便考虑减少状态. 进行两遍bfs,分别为初始状态可以到达的状态,和可以到达终止状态的状态. 同时出现在两次bfs中的状态即为有效状态,一共有141种. 这样就可以跑出来了. 未加矩阵快速幂 50分 ..,..] of longint= ((-,,),(-,,),(,,),(,,),(-,,),(-,,),(,,),(-,,)); dy:..,..] of lo…
搞懂了什么是矩阵快速幂优化.... 这道题的重点不是DP. /* 题意: 小明要走某条路,按照个人兴致,向前走一步的概率是p,向前跳两步的概率是1-p,但是地上有地雷,给了地雷的x坐标,(一维),求小明安全到达最后的概率. 思路: 把路分成好多段,小明安全走完每一段的概率乘起来就是答案. dp[i]=p*dp[i-1]+(1-p)*dp[i-2]; 参考fib数列构造矩阵进行快速幂. 注意初始化的时候,起点概率看作1,起点减一也就是有地雷的地方概率看作0.//屌丝一开始在这里没搞明白. */ #…
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,…, k". Let function(n, k) be the number of elegant s…
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高位数字不为0. 因此,符合我们定义的最小的有趣的数是2013.除此以外,4位的有趣的数还有两个:2031和2301. 请计算恰好有n位的有趣的数的个数.由于答案可能非常大,只需要输出答案除以1000000007的余数. 输入格式 输入只有一行,包括恰好一个正整数n (4 ≤ n ≤ 1000). 输…
Clarke and digits 问题描述 克拉克是一名人格分裂患者.某一天,克拉克变成了一个研究人员,在研究数字. 他想知道在所有长度在[l,r]之间的能被7整除且相邻数位之和不为k的正整数有多少个. 输入描述 第一行一个整数T(1≤T≤5),表示数据的组数. 每组数据只有一行三个整数l,r,k(1≤l≤r≤109,0≤k≤18) 输出描述 每组数据输出一行一个数,表示答案.由于答案太大,你只需对10^9+7取模即可. 输入样例 2 1 2 5 2 3 5 输出样例 13 125 Hint…
Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4100   Accepted: 1051 Description YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into the enemy's base. After overcoming a series difficulties,…
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j)表示dp(x-1, j)对dp(x, i)的贡献.然后用矩阵快速幂就可以了. 时间复杂度O(M3logN + M) ------------------------------------------------------------------- #include<bits/stdc++.h>…
传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少种项链. 分析:这是我做过的最为综合的一道题目(太渣了),首先数位dp筛选出区间[L,R]内的幸运数字总数,dp[pos]表示非限制条件下还有pos位含有的幸运数字个数,然后记忆化搜索一下,随便乱搞的(直接dfs不知会不会超时,本人做法900+ms险过,应该直接dfs会超时),再不考虑旋转相同的情况,可以…
http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] = dp[i-1] + dp[i-2],递推数列可以用矩阵快速幂来加速计算 我们可以用状态dp来做这一题,如果某个格子上被铺了骨牌,就标记为1,否则为0 那么每一列一共有8个状态. 两种状态的表示法 第一种: dp[i][s] 表示填满第i行后,第i+1行的状态为s, 那么s的转移情况如下, 0->…
这道到是不用看题解,不过太经典了,早就被剧透一脸了 这道题很像ac自动机上的dp(其实就是) 然后注意到n很大,节点很小,于是就可以用矩阵快速幂优化了 时间复杂度为o(m^3 *log n); 蒟蒻kpm写得少,改了好久= = CODE: #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int n,m,mod;#define m…
题意大致是这样的,一共要放 m 段括号序列,每一段放 n 个括号,也就是放 n*m个括号,再每一段中的 n 个位置分别有放左括号和右括号的代价,问最终摆放出合法的括号序列的最小代价是多少. 另外保证,n小于20,m小于1e7,m是整数 这个大概是我一年前多做的,当时在21组上T了,然后就放弃了,我也不记得当时怎么做的了,也不想看以前的代码. 很明显 n 个段是循环的,所以肯定每个段作为一个整体考虑.为了保证括号序列的正确性,可以认为左括号为+1,右括号为-1,则正确性即过程中前缀和始终为正,最终…
题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修改,每次修改一个格子的概率.要求输出初始时和每次修改后的概率. \(n\leq 200000,m\leq 3,d\leq 10,q\leq 1000\) 题解 很容易想到状压DP:前\(i\)行在第\(i\)行的状态为\(j\)时连通块个数模\(d=k\)的概率. 当\(m=3\)时每行状态有\(9…
题意 题目给出m(m<=10)个仅仅由A,T,C,G组成的单词(单词长度不超过10),然后给出一个整数n(n<=2000000000),问你用这四个字母组成一个长度为n的长文本,有多少种组成方法可以使得它不含任何一个给出的单词. 分析 当时一看以为是跟训练指南上(UVA11468)一样的题,感觉只有四个字母并且单词数量和长度也比较小,但是一看给出的n有点懵逼.如果再按照书上建立AC自动机以后直接跑DP的方法肯定是不行了.然后我们就要用到,递推利器,矩阵快速幂. 我们还是按照套路先把AC自动机建…
题目链接:http://47.93.249.116/problem.php?id=2182 题目描述 河神喜欢吃零食,有三种最喜欢的零食,鱼干,猪肉脯,巧克力.他每小时会选择一种吃一包. 不幸的是,医生告诉他,他吃这些零食的时候,如果在连续的三小时内他三种都吃了,并且在中间一小时 吃的是巧克力,他就会食物中毒.并且,如果河神在连续三小时内吃到相同种类的食物,他就会不开心. 假设每种类零食的数量都是无限的,那么如果经过n小时,让河神满意的零食吃法有多少种呢?(开心又不 会食物中毒的吃法)答案可能过…
题意: 一条路上有n个地雷,你从1开始走,单位时间内有p的概率走一步,1-p的概率走两步,问安全通过这条路的概率 解析: 很容易想到 dp[i] = p * dp[i-1] + (1 - p) * dp[i]; 然而...t,但这个式子明显可以用矩阵快速幂加个氮气一下加速一下... 把所有的点输入之后 sort一下,那么就能把这条路分成很多段 每一段以地雷为分界线 1 - x[0]  x[0]+1 - x[1]  x[1]+1 - x[2] ````````` 然后求出安全通过每一段的概率  …
Description ​ 有一个\(~n~\)行\(~m~\)列的棋盘,棋盘上可以放很多棋子,每个棋子的攻击范围有\(~3~\)行\(~p~\)列.用一个\(~3 \times p~\)的矩阵给出了棋子攻击范围的模板,棋子被默认在模板中的第一行,第\(~k~\)列,模板中棋子能攻击到的位置标记为\(~1\),不能攻击到的位置是\(~0\) .输入数据保证模板中的第二行第\(~k~\)列是\(~1\).在要求棋子互相不能攻击到的前提下,求摆放棋子的方案数. \(~1 \leq p \leq m,…
题意 如果一个 \(1\to N\) 的排列 \(P=[P_1, P_2, ... P_N]\) 中的任意元素 \(P_i\) 都满足 \(|P_i-i| ≤ K\) ,我们就称 \(P\) 是 \(K\)-偏差排列. 给定 \(N\) 和 \(K\) ,请你计算一共有少个不同的排列是 \(K\)-偏差排列. 例如对于 \(N=3\) ,有 \(3\) 个 \(1\)-偏差排列:\([1, 2, 3], [1, 3, 2], [2, 1, 3]\). 由于答案可能非常大,你只需要输出答案模 \(…
题面欺诈系列... 因为一个点最多只能连到前k个点,所以只有当前的连续k个点的连通情况是对接下来的求解有用的 那么就可以计算k个点的所有连通情况,dfs以下发现k=5的时候有52种. 我们把它们用类似于并查集的方式表达(比如12132代表点1和点3连通,2和5连通,3自己),然后再压缩一下. 但要注意的是,12132和23213这两种实际对应的是一种连通情况,我们只要把它都化成字典序最小的那种就可以了 然后考虑增加一个新点以后状态的转移,可以枚举这个点与前k个点(始状态S)的连边情况,其中有一些…
https://codeforces.com/contest/1117/problem/D 题意 有n个特殊宝石(n<=1e18),每个特殊宝石可以分解成m个普通宝石(m<=100),问组成n颗宝石有多少种方法 题解 数据很大:找规律or矩阵快速幂 转移方程: dp[i]=dp[i-1]+dp[i-m] 因为n<=1e18可以用矩阵快速幂 构造矩阵如图: \[ \left[ \begin{matrix} f[i-1] & f[i-2] & \cdots & f[i…
传送门 矩阵快速幂优化dp简单题. 考虑状态转移方程: f[time][u]=∑f[time−1][v]f[time][u]=\sum f[time-1][v]f[time][u]=∑f[time−1][v] 把一个点拆成9个来转换边长,然后根据题意模拟连边就行了. 最后用矩阵快速幂优化一下转移就能过啦. 代码: #include<bits/stdc++.h> using namespace std; int n,t,m; char s[50]; const int mod=2009; str…
传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后用快速幂转移. 代码: #include<bits/stdc++.h> #define mod 1000000007 #define N 128 #define ll long long using namespace std; int T,up,n,m; struct Matrix{ ll va…