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 ...
随机推荐
- Javascript中的string类型使用UTF-16编码
2019独角兽企业重金招聘Python工程师标准>>> 在JavaScript中,所有的string类型(或者被称为DOMString)都是使用UTF-16编码的. MDN DOMS ...
- SQL Server遍历表中记录的2种方法
SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录.本文将介绍利用使用表变量和游标实现数据库中表的遍历. 表变量来实现表 ...
- Axios 拦截器中添加headers 属性
描述: 已在网上查过怎么在 interceptors 中对header进行处理,// http request 拦截器 axios.interceptors.request.use( config = ...
- 数学--数论--随机算法--Pollard Rho 大数分解算法(纯模板带输出)
ACM常用模板合集 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll pr; ll pmod(l ...
- codeforce 272E Dima and Horses (假DFS)
E. Dima and Horses Dima came to the horse land. There are n horses living in the land. Each horse in ...
- UVA352 The Seasonal War
本文为UserUnknown原创 题目本身不难理解,就是深搜(或广搜,有可能以后会加在这里). 但是洛谷的题目中没有截到输入输出的格式,下面是我从UVA复制下来的样例: Sample input 6 ...
- bzoj4318 OSU!和bzoj 3450 Tyvj1952 Easy
这俩题太像了 bzoj 3450 Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点 ...
- 题目分享V
题意:现在两个人做游戏,每个人刚开始都是数字1,谁赢了就能乘以k^2,输的乘以k(k可以是任意整数,每次不一定相同)现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话Yes,否则No. 分 ...
- Java——TCP/IP超详细总结
网络的基础知识 一.协议 1.简介: 在计算机网络与信息通信领域里,人们经常提及“协议”一词.互联网中常用的具有代表性的协议有IP.TCP.HTTP等.而LAN(局域网)中常用的协议有IPX/SPX” ...
- 关于MySQL数据库的卸载
首先对于MySQL这款数据库来讲,不能简单的卸载就草草了事,我们首先在mysql的文件下面找到my.ini这个文件, 在其中找到mysql数据库所产生的data文件,这个文件一般在c盘的一个隐藏目录下 ...