T<=10组数据问K<=30种珠子每种n<=1e9串成1~n长度的序列共有多少种,mod1234567891。

方程没想到。矩阵不会推。很好。

f[i][j]--长度i,j种珠子方案数,f[i][j]=f[i-1][j]*j(放个旧的)+f[i-1][j-1]+(K-(j-1))(放个新的)

n太大,推不动。由于f[i-1]->f[i],考虑矩乘优化。设递推用的矩阵为A。F[i]表示f[i][1]~f[i][k]。

方法一:f加多一个数表示ans,初始化{0,k,0,0,……},那个k是f[1]。A如下:直接乘即可。注意初始化,以及最后一步谁乘谁搞清楚。

方法二:最终答案为F[1][k]+F[2][k]+……+F[n][k],也就是F[1]+F[2]+……+F[n]的第K项,F[i]=A*F[i-1]=A^(i-1)*F[1],所以问题就是(E+A+A^2+……+A^n-1)*F[1]的第K项,前面那坨东西:

方法(1):G[i]=(E+A+A^2+......+A^i),E是单位矩阵。G[i奇]=G[i-1]*A^i,G[i偶]=G[i/2]+A^(i/2)*G[i/2],这样G[n-1]可以dfs在log时间内求,而每次要一个快速幂求A^i,复杂度k^3log2n,虽能过题但不优秀。

方法(2):(来自yyl大爷)把所有的构造往二次幂想。把n-1二进制表示出来,比如10110,新建个H[i]=(E+A+A^2+.....+A^i-1)注意是i-1,那么H[n]=H[10000]*A^110+H[100]*A^10+H[10]*E,也就是如果能求出H[2^i],那么是可以扫一遍n的二进制位把H[n]求出来的,边扫边更新A的若干次方(遇到1时)。而H[2^i]=H[2^(i-1)]*(A^(2^(i-1))+E),A^(2^i)又是可以算的。算A^(2^i),H[2^i],以及最后枚举二进制位,都是可以k^3logn求出来的。

以下方法一。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
//#include<iostream>
using namespace std; int n,K,T;
#define maxn 111
#define LL long long
typedef LL mat[maxn][maxn];
mat base,ans,f;
const int mod=;
void mul(mat a,mat b,mat &ans)
{
mat t;
memset(t,,sizeof(t));
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
for (int k=;k<=n;k++)
t[i][j]=(t[i][j]+a[i][k]*b[k][j]%mod)%mod;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
ans[i][j]=t[i][j];
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&K,&n);
if (K<n) {puts("");continue;}
memset(base,,sizeof(base));
base[][]=base[][n]=;
base[][]=;
for (int i=;i<=n;i++)
{
base[i][i-]=n-i+;
base[i][i]=i;
}
memset(ans,,sizeof(ans));
for (int i=;i<=n;i++) ans[i][i]=;
while (K)
{
if (K&) mul(ans,base,ans);
mul(base,base,base);
K>>=;
}
memset(f,,sizeof(f));
f[][]=n;
mul(ans,f,f);
printf("%lld\n",f[][]);
}
return ;
}

hdu2294:Pendant的更多相关文章

  1. HDU - 2294: Pendant(矩阵优化DP&前缀和)

    On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend made by K ki ...

  2. [HDU2294]Pendant

    题目:Pendant 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2294 分析: 1)f[i][j]表示长度为i,有j种珍珠的吊坠的数目. $f[i][ ...

  3. 第八章 连词(Les conjonction )

    ★并列连词(La conjonction de coordination ) ()表示联合关系的并列连词 .et连接肯定的内容.如:    ➞Il conduit vite et bien.      ...

  4. java web 开发三剑客 -------电子书

    Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知In ...

  5. 所有selenium相关的库

    通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...

  6. [HDU2294] Pendant - 矩阵加速递推

    Pendant Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. 无废话网页重构系列——(6)HTML主干结构:站点(site)、页面(page)

    本文作者:大象本文地址:http://www.cnblogs.com/daxiang/p/4653546.html 在分析和切出设计稿,以及部署项目目录文件后,开始写HTML Demo. 首先,弄出H ...

  8. Pendant

    Pendant Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. python入门学习:7.函数

    python入门学习:7.函数 关键点:函数 7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中 7.1 定义函数   使用关键字def ...

随机推荐

  1. asp.net 中文部分显示问号

    很神奇的事情,今天部署了一个网站,页面从数据读取新闻后,有些新闻标题全部显示问题号,有几个新闻能正确显示汉字,然后查看新闻页面又能正常显示汉字. 解决办法: 在异常的页面上加上 < %@ COD ...

  2. 洛谷 P1413 坚果保龄球

    题目描述 PVZ这款游戏中,有一种坚果保龄球.zombie从地图右侧不断出现,向左走,玩家需要从左侧滚动坚果来碾死他们. 我们可以认为地图是一个行数为6,列数为60的棋盘.zombie出现的那一秒站在 ...

  3. Sublime Text插件的离线安装-使用htmlprettify美化您的HTML代码

    Sublime Text是广大程序员喜欢的文本编辑器,Jerry觉得它最强大之处在于开放的架构,有丰富的插件为其提供各种各样额外的功能. 作为前端开发人员,经常需要从网上复制粘贴一些代码然后做修改,因 ...

  4. HDU 4281 (状态压缩+背包+MTSP)

    Judges' response Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. Vector(同步)和ArrayList(异步)异同

    //1 同步 异步 //未响应 = 假死 占用内存过多 内存无法进行处理 //请求的方式 :同步 异步 //网页的展现过程中(同步):1. css文件的下载 2.js文件的下载 3.下载你当前的htm ...

  6. 转--C#编程总结

    C#编程总结--总目录 http://www.cnblogs.com/yank/p/3543423.html

  7. python json.loads json.dumps的区别

    json.loads() 是将字符串传化为字典 json.dumps () 是将字典转化为字符串 >>> dict = "{8:'bye', 'you':'coder'}& ...

  8. 将中文库导入到ARM板子中以解决中文显示乱码的教程

    1.将中文字符集导入到ARM板子中的/usr/fonts/目录下 在这里我们使用的字符集为:DroidSansFallback.ttf 下载地址为:https://pan.baidu.com/s/1e ...

  9. 高逼格关闭Win10防火墙

    作为一个开发人员,你还需要进入这个界面来关闭防火墙么? 如果是,那么现在,我将为大家介绍一种高逼格的方式: 第一步: 打开Windows PowerShell(管理员) 第二步:查看当前防火墙状态:n ...

  10. MySQL丨02丨忘记root用户密码怎么办?

    软件:Mysql 版本:8.0.13 1. 先暂停mysql的服务,方法是在cmd里输入如下代码: net stop mysql 2. 在安装文件夹下创建一个文件:mysql-ini.txt (我的安 ...