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 ...
随机推荐
- 尤雨溪的vue怎么学,应该从vue-cli开始,为什么?
带手机验证码登陆, 带全套购物车系统 带数据库 前后端分离开发 带定位用户功能 数据库代码为本地制作好了 带支付宝支付系统 带django开发服务器接口教程 地址: https://www.dua ...
- 好程序员分享Web前端面试题汇总JS篇之跨域问题
为什么80%的码农都做不了架构师?>>> 好程序员分享Web前端面试题汇总JS篇之跨域问题,接着上一篇文章我们继续来探讨web前端面试必备面试题. 跨域解决方案 1. 通过jso ...
- NPM采用Rust以消除性能瓶颈
Npam的指数级增长促使npm工程团队从Node.js切换到Rust,以处理那些将成为性能瓶颈的CPU绑定任务.最近的一份白皮书概述了在Rust中开发这个新服务,以及将其投入生产一年多的经验. 大部分 ...
- (附音视频、PPT地址)《打开Python这扇窗》分享总结
0.导读 2016年最新开发语言排行榜中,Python已经跃居第三,仅次于C.JAVA.掌握Python已经成为时下运维圈的共识,更让人期待的是,本次公开课分享的嘉宾自身就长期专注Python.Doc ...
- 数学--数论--直角三角形--勾股数---奇偶数列法则 a^2+b^2=c^2
先说勾股数: 勾股数,又名毕氏三元数 .勾股数就是可以构成一个直角三角形三边的一组正整数.勾股定理:直角三角形两条直角边a.b的平方和等于斜边c的平方(a²+b²=c²) 勾股数规律: 首先是奇数组口 ...
- python(os 模块)
1.os.name 输出字符串指示正在使用的平台.如果是window 则用'nt'表示,对于Linux/Unix用户,它是'posix' import os print(os.name) #结果如下 ...
- 虚拟机部署单机版kubernetes,minikube,docker
# 目前公司用的是阿里云的容器服务 所以本地搭建个单机版 方便测试使用# VMware® Workstation 12 Pro 版本# 虚拟机环境配置:配置 2核 4G 网络桥接# 系统镜像: Cen ...
- 从excel表格加载数据返回DataSet
添加命名空间:using System.Data.OleDb; /// <summary> /// 从excel表格加载数据返回DataSet /// </summary> / ...
- Spring 学习 之 再探publish-event机制
之前的文章链接:https://blog.csdn.net/qq_41907991/article/details/88544777 我们要知道的是,Spring的publish-event使用的是监 ...
- 201771030129-张琳 实验一软件工程准备—<阅读书之后的三个疑问>
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE/ 本次作业要求链接 https://www.cnblogs.com/nwnu ...