UVA 11651
题目链接:https://cn.vjudge.net/problem/UVA-11651
解题思路:
思路来源于网络。
DP + 矩阵快速幂。
设 dp[i][j] 为满足 score 为 i 且最后一位为 j 的数字的个数。则不难推出其状态转移方程:dp[i][j] = Sum( dp[i-d][k] ) { 其中d=(j-k)*(j-k), i!=k }。
因为 score 最高可到 1e9,一是开不出那么大的数组,二是会超时,所以我们需要再加上矩阵快速幂优化。
1、对于一个 dp[i][j],只有 i > score >= max(i - (base-1)2 ,0) 的这一部分有可能对其结果产生影响;
2、这个dp是有周期性,对于score而言,其周期为(base-1)2 {也就是说,假如 dp[i][j] = dp[i-k1][b1] + dp[i-k2][b2] + dp[i-k3][b3],那么对于任意ib = i + k*(base-1)2 (k为任意整数),dp[ib][j] = dp[ib-k1][b1] + dp[ib-k2][b2] + dp[ib-k3][b3]) }。
由于有上述两个性质,故可以用矩阵快速幂优化。
额,感觉讲的不太好。。。在下尽力了。。。下面引用一位大神(http://www.cnblogs.com/AOQNRMGYXLMV/p/5256508.html)的一张图片。。。其实思路也是引用的(逃
当base=3时,有如下转移:(注意,其中倒数第三行有一个错误。至于哪里错了,就留给读者自己发现吧。)
AC代码:
#include <cstdio>
#include <cstring> using namespace std;
typedef unsigned int ui; //这里要是不用 unsigned int 的话就会报段错误。
const int maxn=;
ui dp[][];
struct Matrix {
ui mat[maxn][maxn];
};
Matrix Multiply(Matrix x,Matrix y,int n){
Matrix tmp;
for(int i=;i<maxn;i++){
for(int j=;j<maxn;j++) tmp.mat[i][j]=;
}
for(int i=;i<n;i++){
for(int j=;j<n;j++){
for(int k=;k<n;k++){
tmp.mat[i][j]+=x.mat[i][k]*y.mat[k][j];
}
}
}
return tmp;
}
Matrix Fast_Power(Matrix a,int m,int n){
Matrix res;
for(int i=;i<maxn;i++){
for(int j=;j<maxn;j++) res.mat[i][j]=;
}
for(int i=;i<n;i++) res.mat[i][i]=;
while(m){
if(m&) res=Multiply(res,a,n);
m>>=;
a=Multiply(a,a,n);
}
return res;
}
int main(){
int T,base,sc;
Matrix temp,Right;
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d%d",&base,&sc);
printf("Case %d: ",t);
memset(dp,,sizeof(dp));
memset(Right.mat,,sizeof(Right.mat));
memset(temp.mat,,sizeof(temp.mat));
int ind=;
dp[][]=; //注意:dp[0][0] = 0, dp[0][i] = 1 (i>0)
Right.mat[][]=;
for(int i=;i<base;i++){
dp[][i]=;
Right.mat[ind][]=dp[][i];
ind++;
} for(int i=;i<(base-)*(base-);i++){
for(int j=;j<base;j++){
for(int k=;k<i;k++){
for(int z=;z<base;z++){
if(z!=j&&i-k==(z-j)*(z-j)) dp[i][j]+=dp[k][z];
}
}
Right.mat[ind][]=dp[i][j];
ind++;
}
}
ui cnt=;
for(int i=;i+base<(base-)*(base-)*base;i++)
temp.mat[i][i+base]=;
for(int i=;i<base;i++){
for(int j=;j<(base-)*(base-);j++){
for(int k=;k<base;k++){
if(k!=i&&(base-)*(base-)-j==(i-k)*(i-k)) temp.mat[base*((base-)*(base-)-)+i][j*base+k]=;
}
}
}
temp=Fast_Power(temp,sc,(base-)*(base-)*base);
Matrix ans=Multiply(temp,Right,(base-)*(base-)*base);
for(int i=;i<base;i++) cnt=cnt+ans.mat[i][];
printf("%u\n",cnt); }
return ;
}
UVA 11651的更多相关文章
- UVa 11651 Krypton Number System DP + 矩阵快速幂
题意: 有一个\(base(2 \leq base \leq 6)\)进制系统,这里面的数都是整数,不含前导0,相邻两个数字不相同. 而且每个数字有一个得分\(score(1 \leq score \ ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- ACM--[kuangbin带你飞]--专题1-23
专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
随机推荐
- 【JAVA基础】03 Java语言基础
前言:流程控制语句 什么是流程控制语句 流程控制语句:可以控制程序的执行流程. 流程控制语句的分类 顺序结构 选择结构 循环结构 执行流程: 从上往下,依次执行. 案例演示 输出几句话看效果即可 cl ...
- ZLEXCOUNT key min max
1 简介 ZLEXCOUNT 命令用于计算有序集合中指定成员之间的成员数量. 2 语法 2.1 完整示例 zlexcount zset [member1 [member5 2.2 说明 指令 是否必须 ...
- Windows 10 MSDN官方原版ISO镜像(简体中文)下载
http://www.heu8.com/2800.html 硬件要求如下:处理器:1 GHz 或更快的处理器或 SoC RAM:1 GB(32 位)或 2 GB(64 位) 硬盘空间:16 GB(32 ...
- 图论--差分约束--POJ 3159 Candies
Language:Default Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 43021 Accep ...
- 图论--LCA--树上倍增法(在线)
/* * LCA在线算法(倍增法) */ const int MAXN = 10010; const int DEG = 20; struct Edge { int to, next; } edge[ ...
- 纯django开发最完美博客
2020年5月打造最时尚博客系统教程 为了学习速度,集中精力学习django和博客开发, 没有使用其它框架,也没有使用css预处理等 这样学起来最方便, 博客前后端都完成, www.duanshuil ...
- Spring Boot 整合 Dubbo和Zookeeper
Spring Boot 整合 Dubbo和Zookeeper Spring Boot 整合 Dubbo和Zookeeper 环境介绍 Zookeeper 安装 启动 Dubbo admin 搭建 创建 ...
- 不可错过的java面试博客之java集合篇
1. List List 是有序的 Collection.Java List 一共三个实现类: 分别是 ArrayList.Vector 和 LinkedList ArrayList ArrayLis ...
- tp5中使用ueditor编辑器保存文本到数据库后回显后显示html标签问题解决办法
在编辑器ueditor中获取文本,保存到到数据库后为 当在数据库中提取出来,在显示回ueditor编辑器时候,出了问题, html标签都显示出来了 百度了下别人的解决办法是,使用官方提供的api 可是 ...
- 基于3D NAND层差异的固态盘请求调度算法研究立项 报告
Abstract SSD(Solid State Drive),因其超高的读写性能,以及价格的走低趋势逐渐占据市场,为人们带来更好的用户体验,也为企业级的高并行业务需要提供了一定支持,近几年来SSD的 ...