题目链接: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. Linux网络服务第七章DNS域名解析服务

    端口:53 一.DNS服务器 正向解析:根据域名查IP地址,即将指定的域名解析为相对应的IP地址.域名的正向解析是DNS服务器最基本的功能,也是最常用的功能. 反向解析:根据IP地址查域名,即将指定的 ...

  2. HDU 1402 A*B

    #include <bits/stdc++.h> using namespace std; typedef long long ll; #define ms(s,a) memset(s,a ...

  3. mycat入门部署安装

    mycat是一种比较简单的中间件产品,可以帮助mysql进行分库,同时统一在一个逻辑库. 硬件环境:系统:centos 7.6数据库版本:5.7.19mycat:1.6..6.1 github上下载m ...

  4. 使用CXF开发Web Service服务

    1.使用CXF开发Web Service服务端 1.1 开发一个Web Service业务接口,该接口要用@WebService修饰 (1)创建一个Java项目MyServer (2)在MyServe ...

  5. 初学dp心得

    从STL到贪心,再到现在的动态规划,可以说动态规划真的让我学的有点蒙,对于一些题目,会做,但是不会用DP,现在还不能熟练的写出状态转移方程,更重要的是,自己宛如一个哺乳期的小孩,做题需要套模板,没有模 ...

  6. POJ 3241Object Clustering曼哈顿距离最小生成树

    Object Clustering Description We have N (N ≤ 10000) objects, and wish to classify them into several ...

  7. BSGS 和扩展

    BSGS BSGS,全称叫 BabyStepGiantStep,也就是大步小步 其实还是比较暴力的 它可以\(O(\sqrt p)\)的复杂度内解出: \[a^x\equiv n\pmod p,\gc ...

  8. Vxlan L3

    拓扑图: CE1 <CE1>display current-configuration !Software Version V800R013C00SPC560B560 !Last conf ...

  9. 手把手教你使用ADB卸载手机内置App软件

    [一.前言] 不知道你们有没有那么一段黑暗时期,刚买个手机,手机上内置一堆app,还卸载不掉,然后每天各种广告,手机一共1G的运行内存,那些流氓app还要再占走一些内存,真是让人欲哭无泪啊,后来我就学 ...

  10. Python基础00 教程

    Python: 简明 Python 教程 廖雪峰Python3教程 Python快速教程 (手册) 爬虫: 汪海的实验室:Python爬虫入门教程 静觅: Python爬虫学习系列教程 Flask: ...