题目链接: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){也就是说,假如 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的更多相关文章

  1. UVa 11651 Krypton Number System DP + 矩阵快速幂

    题意: 有一个\(base(2 \leq base \leq 6)\)进制系统,这里面的数都是整数,不含前导0,相邻两个数字不相同. 而且每个数字有一个得分\(score(1 \leq score \ ...

  2. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  3. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  4. ACM--[kuangbin带你飞]--专题1-23

    专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...

  5. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  6. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  7. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  8. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  9. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

随机推荐

  1. 6.Python中内存是如何管理的?

    Python中内存是如何管理的? Python memory is managed by Python private heap space. All Python objects and data ...

  2. ASP.NET Core 找不到 npm指令异常

    1.错误再现 利用VS2019预览版创建ASP.NET Core 的单页面Web程序 创建后直接运行,出现如下错误 Ensure that 'npm' is installed and can be ...

  3. 如何设计高并发web应用

      所谓高并发,就是同一时间有很多流量(通常指用户)访问程序的接口.页面及其他资源,解决高并发就是当流量峰值到来时保证程序的稳定性. 我们一般用QPS(每秒查询数,又叫每秒请求数)来衡量程序的综合性能 ...

  4. db2 锁表

    2019独角兽企业重金招聘Python工程师标准>>> 查询锁表情况 db2 => get snapshot for locks on databasename 可以看到什么表 ...

  5. 数学--数论-- HDU 2601 An easy problem(约束和)

    Problem Description When Teddy was a child , he was always thinking about some simple math problems ...

  6. 安装KubeSphere

    1. KubeSphere 是什么 1.1. 官方解释 KubeSphere是一个分布式操作系统,提供以Kubernetes为核心的云原生堆栈,旨在成为第三方应用程序的即插即用架构,以促进其生态系统的 ...

  7. Https双向验证与Springboot整合测试-人来人往我只认你

    1 简介 不知不觉Https相关的文章已经写了6篇了,本文将是这个专题的最后一篇,起码近期是最后一篇.前面6篇讲的全都是单向的Https验证,本文将重点介绍一下双向验证.有兴趣的同学可以了解一下之前的 ...

  8. 过滤idea一些不需要的文件和文件夹的显示,在使用svn的时候可以很方便的过滤不需要提交的文件

    *.classpath;*.gitignore;*.hprof;*.idea;*.iml;*.lst;*.project;*.pyc;*.pyo;*.rbc;*.settings;*.sh;*.yar ...

  9. 在Vue中使用iview的Select控件实现一个多级选项列表

    前言 今天项目要实现一个多级选项列表,发现iview官网上没有写这个例子,于是自己就实现了,如果对你有帮助请点个赞 ‘ * ’!! 解决方法:下面我们就来使用V-for 来定义一个二级选项列表 ,代码 ...

  10. SpringBoot返回JSON日期格式问题

    SpringBoot中默认返回的日期格式类似于这样: "birth": 1537407384500 或者是这样: "createTime": "201 ...