珍珠吊坠

Time Limit:10000MS  Memory Limit:65536K
Total Submit:25 Accepted:17
Case Time Limit:1000MS

Description

有k种珍珠,每种珍珠有N颗,问能组合出多少种含有k种珍珠且长度<=N的吊坠?(注意:吊坠为链状,非环状)

Input

一行,两个整数N和K

Output

一行,一个整数,表示所求方案总数,结果可能很大,mod 1234567891再输出

Sample Input

样例输入1:
2 1
样例输入2:
3 2

Sample Output

样例输出1:
2
样例输出2:
8

Hint

1 ≤ N ≤ 1,000,000,000
1 ≤ K ≤ 30
样例2说明:
设两种珍珠编号为1和2
1 2
2 1
1 1 2
1 2 1
2 1 1
2 2 1
2 1 2
1 2 2

Source

HDU2294

状态:
           dp[i][j]表示用j种珍珠构成长度恰好为i的吊坠,总的方案数
方程:
           dp[i][j] = (k-(j-1))*dp[i-1][j-1] + j*dp[i-1][j];
结果:
           ans[i]表示长度在i以内且满足条件的吊坠的总方案数
           ans[i]=dp[1][k]+dp[2][k]+...+dp[i][k]
           显然,问题的最终答案为ans[n]

但是考虑到n的范围,我们必须用矩阵乘法优化

根据前面的分析显然有:ans[i]=ans[i-1]+dp[i][k]
参考前面所讲的数列构造方法:
我们构造一个1*(k+1)的矩阵F{  dp[i][1], dp[i][2], dp[i][3], ... ,dp[i][k], ans[i-1]  }
我们希望再构造一个(k+1)*(k+1)的矩阵A,使得:F * A={ dp[i+1][1], dp[i+1][2], dp[i+1][3], ... , dp[i+1][k], ans[i] }

矩阵A的求法很好求,这里就不过多解释了

最终答案就是F*A^n;其中矩阵F的初始值:
{dp[1][1], dp[1][2], dp[1][3], ... ,dp[1][k], ans[0]}
={    k    ,     0      ,      0     , ... ,   0      ,    0      }

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;
const int mod=1234567891;
typedef LL arr[35][35];
arr z,A,ans;
LL k,n;
void cheng(arr y,arr x){memset(z,0,sizeof(z));LL i,j,q;for(i=1;i<=k+1;i++)for(j=1;j<=k+1;j++)for(q=1;q<=k+1;q++)z[i][j]=(z[i][j]+y[i][q]*x[q][j])%mod;memcpy(y,z,sizeof(z));
}
void mb(LL b){LL i;for(i=1;i<=k+1;i++)ans[i][i]=1;while(b){if(b&1)cheng(ans,A);b>>=1;cheng(A,A);}
}
int main(){scanf("%I64d%I64d",&n,&k);LL i,j;A[k+1][k+1]=A[k][k+1]=1,A[k][k]=k;for(i=1;i<k;i++)A[i][i]=i,A[i][i+1]=k-i;mb(n);cout<<(k*ans[1][k+1])%mod;
}

NKOI 3124 珍珠吊坠相关推荐

  1. 一个排列是某些对象的有序组合,例如,3124 就是数字 1,2,3,4 的一种可能排列。 如果所有的排列按照数值或者字母序排序,我们称其为一个字典序。 0, 1, 2 的字典排列有:012 021 1

    字典排列 一个排列是某些对象的有序组合,例如,3124 就是数字 1,2,3,4 的一种可能排列. 如果所有的排列按照数值或者字母序排序,我们称其为一个字典序. 0, 1, 2 的字典排列有:012 ...

  2. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  3. LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP

    题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...

  4. [LOJ#3124][CTS2019]氪金手游(概率 + 树形 DP + 容斥)

    Address 洛谷 P5405 LOJ #3124 Solution 先考虑如果以某个点(下面定为 111 )为根时,如果所有的限制二元组 (u,v)(u,v)(u,v) 都满足 uuu 是 vvv ...

  5. 前端学习(3124):react-hello-react之props的简写

  6. 前端学习(3124):react-hello-react之批量传递props

  7. 前端学习(3124):react-hello-react之对props进行限制

  8. LOJ#3124. 「CTS2019 | CTSC2019」氪金手游 容斥+DP

    神仙容斥+DP可还行. code: #include <cstdio> #include <cmath> #include <vector> #include &l ...

  9. [LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】

    Description Solution 首先它的限制关系是一个树形图 首先考虑如果它是一个外向树该怎么做. 这是很简单的,我们相当于每个子树的根都是子树中最早出现的点,概率是容易计算的. 设DP状态 ...

最新文章

  1. PHP自动加载__autoload的工作机制
  2. 取得MS SQL 2000数据库一个表的所有列名
  3. HTML+CSS+JS实现 ❤️3D建筑结构旋转特效❤️
  4. 某页纸api接口网站源码 高速php源码
  5. 黄渤高情商:小S和林志林同时掉到水里,你先救谁
  6. 深圳警方出手!“钱爸爸”涉嫌集资诈骗 已累计冻结2.13亿元
  7. Cortex M3/M4 学习摘要(二)
  8. tibco rv java实例_Tibco RV - fault tolerance
  9. 2018-09-13 代码翻译尝试-使用Roaster解析和生成Java源码
  10. redis使用中经常出现 Could not get a resource from the pool 异常,解决办法总结
  11. 基于tkinter制作的一个策略小游戏
  12. 微信小程序运用云函数调用新闻类API
  13. exchange邮件中继服务器搭建,Exchange简单实现SMTP匿名中继的机制和原理
  14. 众生百相:我的10年软件开发生涯
  15. Tomcat启动出现乱码·解决方法
  16. 房贷中的等额本息和等额本金有什么区别?
  17. [USF-XSim-62] ‘elaborate‘ step failed with errors.[Vivado 12-4473] Detected error while running sim
  18. Java学习之while循环及案例
  19. Fluent Meshing对称模型形成完整模型
  20. 菜谱小程序_云应用程序食谱

热门文章

  1. python游戏开发之小乌龟逃离鲨海
  2. B 站 18 岁高中生火了:历时 200 天,成功造了个机器人!Python「注入灵魂」
  3. JavaWeb 中的cookie
  4. 移动端WebApp开发 你需要从这几点学起
  5. html全屏飘雪花特效,html5 3D飘落雪花动画特效
  6. 哪款app看计算机书籍好,实测六款主流看图软件,看看哪一款更轻小、便捷、实用?...
  7. 游戏 2048 的最佳算法是什么?
  8. 时间的玫瑰-让自己慢下来(24)
  9. 最全pink老师JavaScript笔记-JavaScript 基础部分(同步PPT)
  10. 【笔记总结】高中英语——其一:定语从句