【CF497E】Subsequences Return 矩阵乘法
【CF497E】Subsequences Return
题意:设$s_k(x)$表示x在k进制下各位数的和mod k的值。给出k,现有序列$s_k(1),s_k(2),...s_k(n)$。求这个序列有多少个本质不同的子序列。
$n\le 10^{18},k\le 30$
题解:状态非常巧妙(其实做过类似套路就知道了)。看到$n=10^{18}$就一定是让你矩乘了。我们希望构建出一个类似于自动机的东西,它能识别出一个序列的所有子序列,且点数最好是在$O(k)$级别的,怎么办呢?
假如我们真的构建出了一个自动机,那么对于他的一个状态x,现在新来了一个数a,如果a是x想要的,那么从x转移到其它状态,否则转移到自己。那我们不妨直接设x这个状态表示它下一个想要的数是x的方案数。如果匹配成功,则下一个想要的数可以是任意数,并使计数器+1,否则它想要的数还是自己。
接着考虑怎么矩乘,容易想到将x放到k进制下表示。用$A_{i,j}$表示$s_k(j\times k^i)..s_k((j+1)\times k^i-1)$这段数对应的转移矩阵。那么$A_{i,j}$其实就是$A_{i-1,j}A_{i-1,j+1}...A_{i-1,k-1}A_{i-1,0}...A_{i-1,j-1}$。用前缀和优化一下即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll P=1000000007;
int m,len;
ll n;
ll v[61]; struct M
{
ll v[31][31];
M () {memset(v,0,sizeof(v));}
ll * operator [] (const int &a) {return v[a];}
M operator * (const M &a) const
{
M b;
int i,j,k;
for(i=0;i<=m;i++) for(j=0;j<=m;j++) for(k=0;k<=m;k++) b.v[i][j]=(b.v[i][j]+v[i][k]*a.v[k][j])%P;
return b;
}
}T[60][30],S,s1[60][30],s2[60][30]; int main()
{
scanf("%lld%d",&n,&m);
v[0]=n;
while(v[len]) v[len+1]=v[len]/m,v[len]%=m,len++;
int i,j,a,b;
for(i=0;i<=m;i++) S[0][i]=1;
for(i=0;i<len;i++)
{
for(j=0;j<=m;j++) T[i][0][j][j]=1;
if(!i)
{
for(j=0;j<m;j++)
{
T[i][j][m][m]=1;
for(a=0;a<m;a++)
{
if(a!=j)
{
T[i][j][a][a]=1;
continue;
}
for(b=0;b<=m;b++) T[i][j][a][b]=1;
}
}
}
else
{
for(j=0;j<m;j++)
{
if(!j) T[i][j]=s2[i-1][0];
else T[i][j]=s2[i-1][j]*s1[i-1][j-1];
}
}
for(s1[i][0]=T[i][0],j=1;j<m;j++) s1[i][j]=s1[i][j-1]*T[i][j];
for(s2[i][m-1]=T[i][m-1],j=m-2;j>=0;j--) s2[i][j]=T[i][j]*s2[i][j+1];
}
for(i=len-1,j=0;i>=0;i--)
{
while(v[i]--) S=S*T[i][j],j=(j+1)%m;
}
printf("%lld",S[0][m]);
return 0;
}//1000000000000000000 2
【CF497E】Subsequences Return 矩阵乘法的更多相关文章
- *HDU2254 矩阵乘法
奥运 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...
- *HDU 1757 矩阵乘法
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- CH Round #30 摆花[矩阵乘法]
摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...
- POJ3070 Fibonacci[矩阵乘法]
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
- bzoj 2738 矩阵乘法
其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...
- 【BZOJ-2476】战场的数目 矩阵乘法 + 递推
2476: 战场的数目 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 38[Submit][Status][Discuss] D ...
- 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1012 Solved: 566[Submit][S ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
随机推荐
- __c语言__测一段代码的运行时间
2017-09-16 13:35:56 感觉很实用. /************************************** time ./a.out 命令所花费的real时间.user时间和 ...
- 一款开源免费的WPF图表控件ModernuiCharts
一款简洁好看的Chart控件 支持WPF.silverlight.Windows8 ,基本够用,主要是开源免费的.(商业控件ComponentOne for WPF要4w多呢) This proj ...
- .NET Threadpool的一点认识
说到.NET Threadpool我想大家都知道,只是平时比较零散,顾现在整理一下: 一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相 .NET Threadpool ...
- 20190131 经验总结:如何从rst文件编译出自己的sqlalchemy的文档
20190131 经验总结:如何编译sqlalchemy的文档 起因 www.sqlalchemy.org官网上不去了,不管是直接上,还是用代理都不行. sqlalchemy属于常用工具,看不到官方的 ...
- Android: Android Studio签名打包的两种方式(zz)
注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如果不知道签名是啥意思, ...
- SSE图像算法优化系列六:OpenCv关于灰度积分图的SSE代码学习和改进。
最近一直沉迷于SSE方面的优化,实在找不到想学习的参考资料了,就拿个笔记本放在腿上翻翻OpenCv的源代码,无意中看到了OpenCv中关于积分图的代码,仔细研习了一番,觉得OpenCv对SSE的灵活运 ...
- Jupyter notebook安装扩展插件
1. 安装Jupyter Notebook pip install jupyter 2. 安装Jypyter Notebook扩展包 pip install jupyter_contrib_nbext ...
- 积木式编程——自制app点灯
技术:51单片机.串口.蓝牙.积木式编程 概述 这里简单入门了积木式编程,做了个简易APP用来开灯关灯,当然你可以继续添加内容,可以做智能家居.遥控汽车和环境监控等等. 详细 代码下载:http: ...
- 单片机成长之路(51基础篇) - 004 STC89C52MCU 软件实现系统复位
用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的8051单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦.STC单片机增加了相应的硬件功能, ...
- Mathmatica简介
作者:桂. 时间:2018-06-27 21:53:34 链接:https://www.cnblogs.com/xingshansi/p/9236502.html 前言 打算系统学习一些数学知识,容 ...