UVa 11651 Krypton Number System DP + 矩阵快速幂
题意:
有一个\(base(2 \leq base \leq 6)\)进制系统,这里面的数都是整数,不含前导0,相邻两个数字不相同。
而且每个数字有一个得分\(score(1 \leq score \leq 10^9)\),得分为 相邻两个数字之差的平方之和。
给出\(base\)和\(score\),求满足条件的整数的个数 \(mod \, 2^{32}\)。
分析:
首先考虑DP的做法:
设\(dp(i, j)\)表示满足当前分数为\(i\)最后一个数字是\(j\)的数字的个数。
递推就是枚举下一个数字\(k\),就有转移方程:
\(dp(i+d,k)=\sum dp(i, j)\),其中\(k \neq j\)且\(d=(k-j)^2\)。
这种方法的复杂度使\(O(base^2 \cdot score)\)的。
考虑矩阵优化:
因为状态转移中,能得到的最大分数是\((base-1)^2\),所以我们的转移矩阵只要保留前面\((base-1)^2\)个\(score\)的信息就行了。
用语言不方便表达,我举具体例子,
当\(base=3\)时,有如下转移:

上面9行很好理解,就是一个错位。
下面3行才是状态的转移。
容易看出,我们的矩阵的边长最大会达到\(6(6-1)^2=150\)。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned int LL;
const int maxn = 150;
int n, m, sz;
struct Matrix
{
LL a[maxn][maxn];
Matrix() {
for(int i = 0; i < maxn; i++)
for(int j = 0; j < maxn; j++) a[i][j] = 0;
}
Matrix operator * (const Matrix& t) const {
Matrix ans;
for(int i = 0; i < sz; i++)
for(int j = 0; j < sz; j++) if(a[i][j])
for(int k = 0; k < sz; k++)
ans.a[i][k] += a[i][j] * t.a[j][k];
return ans;
}
};
Matrix pow_mod(Matrix a, int n) {
Matrix ans;
for(int i = 0; i < sz; i++) ans.a[i][i] = 1;
while(n) {
if(n & 1) ans = ans * a;
a = a * a;
n >>= 1;
}
return ans;
}
LL a[maxn], dp[25][6];
int main()
{
int T; scanf("%d", &T);
for(int kase = 1; kase <= T; kase++) {
printf("Case %d: ", kase);
scanf("%d%d", &n, &m);
int N = (n - 1) * (n - 1) * n;
//DP
memset(dp, 0, sizeof(dp));
for(int i = 1; i < n; i++) dp[0][i] = 1;
for(int i = 0; i < (n - 1) * (n - 1); i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
int d = (k - j) * (k - j);
if(!d || i + d > (n - 1) * (n - 1)) continue;
dp[i + d][k] += dp[i][j];
}
}
}
if(m < (n - 1) * (n - 1)) {
LL ans = 0;
for(int i = 0; i < n; i++) ans += dp[m][i];
printf("%u\n", ans);
continue;
}
sz = N;
int s = (n - 1) * (n - 1);
for(int i = 0; i < (n - 1) * (n - 1); i++)
for(int j = 0; j < n; j++)
a[i * n + j] = dp[i][j];
Matrix M;
for(int i = n; i < N; i++) M.a[i - n][i] = 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) if(j != i) {
int d = (j - i) * (j - i);
M.a[N - n + i][n * (s - d) + j] = 1;
}
M = pow_mod(M, m - (n - 1) * (n - 1) + 1);
LL ans = 0;
for(int i = N - n; i < N; i++)
for(int j = 0; j < N; j++)
ans += M.a[i][j] * a[j];
printf("%u\n", ans);
}
return 0;
}
UVa 11651 Krypton Number System DP + 矩阵快速幂的更多相关文章
- bnuoj 34985 Elegant String DP+矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂
[题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*
BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...
- Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】
题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...
- codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)
题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】
典型的两道矩阵快速幂求斐波那契数列 POJ 那是 默认a=0,b=1 UVA 一般情况是 斐波那契f(n)=(n-1)次幂情况下的(ans.m[0][0] * b + ans.m[0][1] * a) ...
随机推荐
- 2.语言概述-JavaScript权威指南笔记
上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格. ...
- java学习笔记(2)——数组
1.创建数组: int[] a = new int[n];//数组长度n不要求为常数,一旦创建了数组,其大小不可改变 int[] a = {0,1,2,3};//也可这样定义 获得数组元素的个数:ar ...
- springboot项目实现批量新增功能
这个困扰我一整天东西,终于解决了. 首先是mybatis中的批量新增sql语句. 注意:这里我给的是我需要新增的字段,你们改成你们需要的字段. <insert id="insertBa ...
- hystrix 给方法加断路器
添加依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>s ...
- 【Unity3D】3D游戏学习
1.理解游戏元素,简单回答以下问题: 1.1简单介绍一款上世纪(19XX)出品的计算机游戏,然后按课件的方法描述游戏的五个基本元素.(讲目标.玩法.规则) 1.1.1仙剑奇侠传 <仙剑奇侠传&g ...
- 【机器学习实战】第2章 K-近邻算法(k-NearestNeighbor,KNN)
第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法主要是用来进行分类的. KNN 场景 电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢? 动作 ...
- 键盘各键对应的ASCII码值(包括鼠标和键盘所有的键)
ESC键 VK_ESCAPE (27)回车键: VK_RETURN (13)TAB键: VK_TAB (9)Caps Lock键: VK_CAPITAL (20)Shift键: VK_SHIFT ($ ...
- JFinal视频教程-JFnal学院分享课
最近JFinal学院出了JFinal视频教程分享课,请笑纳~ 课程列表: 1.[JFinal版]微信小程序富文本渲染解决方案-html2wxml4J分享课 这个课程主要讲的是使用基于JFinal开发的 ...
- 洛谷 P2663 越越的组队
题目描述 班级要组织一场综合能力竞赛,全班同学(N个,N是偶数)分成两队互相竞争.老师找到了越越并给了越越一张全班同学综合能力测试的成绩,要求他从全班同学中选出一半(他自己也可能被选),并要求这些同学 ...
- codeforce Gym 100418K Cards (概率,数学)
题意:麦田的故事,n张牌,取x张牌,记住前x张牌最大的值m,继续往后取,遇到第一张比m大的牌就停下来.求一个x使得最后的牌在整副牌里是最大的期望最大. 假设最大的牌是A,A在各种位置出现的概率就是相等 ...