UVA 11651 Krypton Number System(矩阵加速DP)
来源:互联网 发布:大数据工程师医疗 编辑:程序博客网 时间:2024/06/06 03:47
题目大意:
对于一个没有前导0,相邻位数不相同的N(2<=N<=6)进制数字,得分为所有相邻位数的差值的平方和。告诉你一个得分S(1<=S<=1e9),问有多少个满足题意的数字。
解题思路:
首先我们就可想到dp[i][j]表示得分为i,最后一位为j的方案数,转移方程为
不过由于S太大,需要使用矩阵加速。
由于转移最多(N-1)*(N-1)*N个值,所以我们的结果矩阵的边长就要有(N-1)*(N-1)*N。按照转移方程就可以构造矩阵,然后快速幂得到结果。
以N=3为例:
AC代码:
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <ctime>#include <vector>#include <queue>#include <stack>#include <deque>#include <string>#include <map>#include <set>using namespace std;#define INF 0x3f3f3f3f#define LL long long#define fi first#define se second#define mem(a,b) memset((a),(b),sizeof(a))const LL MAXN=5*5*6;const LL MOD=1ll<<32ll;LL N,S,L;struct Matrix{ LL a[MAXN][MAXN]; Matrix() { memset(a,0,sizeof(a)); } void init() { for(LL i=0;i<L;i++) for(LL j=0;j<L;j++) a[i][j]=(i==j); } Matrix operator * (const Matrix &B)const { Matrix C; for(LL i=0;i<L;i++) for(LL k=0;k<L;k++) if(a[i][k])//由于构造的矩阵0非常多,所以这样可以优化很多 for(LL j=0;j<L;j++) C.a[i][j]=(C.a[i][j]+1LL*a[i][k]*B.a[k][j]+MOD)%MOD; return C; } Matrix operator ^ (const LL &t)const { Matrix A=(*this),res; res.init(); LL p=t; while(p) { if(p&1)res=res*A; A=A*A; p>>=1; } return res; }};LL dp[25][6];void init(){ mem(dp,0);}int main(){ int T_T; scanf("%d",&T_T); for(int cas=1;cas<=T_T;++cas) { scanf("%lld%lld",&N,&S); L=(N-1)*(N-1)*N; init(); for(int i=1;i<N;++i)//先普通dp求出前(N-1)*(N-1)项,用来构造初始矩阵 dp[0][i]=1; for(int i=1;i<(N-1)*(N-1);++i) for(int j=0;j<N;++j) for(int k=1;k<=N;++k)//差值 { if(j+k<N&&k*k<=i) dp[i][j]+=dp[i-k*k][j+k]; if(j-k>=0&&k*k<=i) dp[i][j]+=dp[i-k*k][j-k]; } Matrix res;//构造初始矩阵 for(int i=0;i<(N-1)*(N-1);++i) for(int j=0;j<N;++j) res.a[i*N+j][0]=dp[i][j]; Matrix op;//转移矩阵 for(int i=0;i<L-N;++i)//移位 op.a[i][i+N]=1; for(int i=0;i<N;++i)//根据转移方程构造 for(int j=1;j<N;++j) { if(i+j<N) op.a[L-N+i][L-(j*j)*N+i+j]=1; if(i-j>=0) op.a[L-N+i][L-(j*j)*N+i-j]=1; } res=(op^S)*res; LL ans=0; for(int i=0;i<N;++i) ans=((ans+res.a[i][0])%MOD+MOD)%MOD; printf("Case %d: %lld\n",cas,ans); } return 0;}
阅读全文
0 0
- UVA 11651 Krypton Number System(矩阵加速DP)
- uva Krypton Number System dp+矩阵优化
- UVA 11651 - Krypton Number System(DP+矩阵快速幂)
- uva 11651 - Krypton Number System(矩阵快速幂)
- UVA11651Krypton Number System(DP+矩阵快速幂)
- HDU5863(dp,矩阵加速)
- HDU3519Lucky Coins Sequence(DP+矩阵加速)
- poj 3070 Fibonacci(矩阵加速DP)
- 广西邀请赛PD(dp+矩阵加速)
- DP·矩阵加速
- UVA - 129 Krypton Factor (回溯)
- UVa 129 - Krypton Factor (DFS 回溯)
- UVa 129:Krypton Factor(回溯)
- UVa-129-Krypton Factor(回溯法)
- POJ 3734 矩阵加速dp
- zoj3690Choosing number 矩阵dp
- uva 11400 Lighting System Design (dp)
- UVa 11400 - Lighting System Design(DP)
- 2017北大信科夏令营机试B
- 判断页面内容是否存在变动
- Hadoop1.x的伪分布安装步骤
- 【原创】浅谈搜索(下-bfs)
- Bootstrap中jumbotron属性
- UVA 11651 Krypton Number System(矩阵加速DP)
- U盘安装Linux安装报错及解决方案
- 无法加载php_exifUnable to load dynamic library 'D:/AppServ\php5\ext\php_exif.dll'
- 一招新的技能 React中的Context
- 在线机器学习FTRL(Follow-the-regularized-Leader)算法介绍
- POJ 2386
- 第九场个人训练赛
- 自定义百度网盘分享密码提取码
- CDH安装出现 BUG 正在获取安装锁.. BEGIN flock 4