codeforces 497E Subsequences Return

想法

做完这题,学了一些东西。

1、求一个串不同子序列个数的两种方法。解一 解二

2、这道题 \(n\) 很大,很容易想到矩阵加速,但是之前遇到的矩阵的题目,矩阵都是相同的,这题的矩阵虽然不同,但是至多 \(k\) 个,并且出现规律与 \(0\) ~ \(n-1\) 的 \(k\) 进制形态有关。题解中基于这点进行的优化和 \(dp\) 的思想又很像。

代码

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi; const int MOD=1e9+7, N=33; ll n;
int k;
vi dig; inline void upd(ll &a, ll b) {
a+=b;
if(a>=MOD) a-=MOD;
} struct M {
ll a[N][N];
M() {memset(a,0,sizeof(a));}
void Set() {rep(i,0,k+1) a[i][i]=1;}
M operator * (const M &c) const {
M res;
rep(i,0,k+1) rep(j,0,k+1) rep(_,0,k+1) upd(res.a[i][j], a[i][_]*c.a[_][j]%MOD);
return res;
}
}A[N<<1][N], S[N<<1][N], P[N<<1][N], ans; int main() {
scanf("%lld%d",&n,&k);
rep(i,0,k) {
A[0][i].Set();
rep(j,0,k+1) A[0][i].a[i][j]=1;
}
ll len=k;
for(int i=1;len<=n;++i, len*=k) {
S[i-1][k-1]=A[i-1][k-1];
for(int j=k-2; ~j; --j) S[i-1][j]=A[i-1][j]*S[i-1][j+1];
P[i-1][0]=A[i-1][0];
rep(j,1,k) P[i-1][j]=P[i-1][j-1]*A[i-1][j];
A[i][0]=S[i-1][0];
rep(j,1,k) A[i][j]=S[i-1][j]*P[i-1][j-1];
}
while(n) {
dig.pb(n%k);
n/=k;
}
int s=0;
ans.Set();
for(int i=sz(dig)-1;~i;--i) {
rep(j,0,dig[i]) {
ans=ans*A[i][(j+s)%k];
}
s=(s+dig[i])%k;
}
ll res=1;
rep(i,0,k) upd(res, ans.a[i][k]);
printf("%lld\n",res);
return 0;
}

codeforces 497E Subsequences Return的更多相关文章

  1. Codeforces 497E - Subsequences Return(矩阵乘法)

    Codeforces 题目传送门 & 洛谷题目传送门 一道还算不错的矩乘 tea 罢,不过做过类似的题应该就比较套路了-- 首先考虑对于一个固定的序列 \(\{a\}\) 怎样求其本质不同的序 ...

  2. 【CF497E】Subsequences Return 矩阵乘法

    [CF497E]Subsequences Return 题意:设$s_k(x)$表示x在k进制下各位数的和mod k的值.给出k,现有序列$s_k(1),s_k(2),...s_k(n)$.求这个序列 ...

  3. Codeforces 597C. Subsequences (树状数组+dp)

    题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长 ...

  4. CodeForces - 597C Subsequences (树状数组+动态规划)

    For the given sequence with n different elements find the number of increasing subsequences with k + ...

  5. CodeForces - 597C Subsequences 【DP + 树状数组】

    题目链接 http://codeforces.com/problemset/problem/597/C 题意 给出一个n 一个 k 求 n 个数中 长度为k的上升子序列 有多少个 思路 刚开始就是想用 ...

  6. CodeForces - 1183E Subsequences (easy version) (字符串bfs)

    The only difference between the easy and the hard versions is constraints. A subsequence is a string ...

  7. codeforces#1183H. Subsequences(字符串dp)

    题目链接: http://codeforces.com/contest/1183/problem/H 题意: 给出一个长度为$n$的字符串,得到$k$个子串,子串$s$的花费是$n-|s|$ 计算最小 ...

  8. codeforces 597C - Subsequences

    枚举子序列的末尾,递推. 方案数:f[i = 以i结尾][k =子序列长度] = sum(f[j][k-1]),j < i. 转移就建立k个BIT. #include<bits/stdc+ ...

  9. CodeForces - 1183H Subsequences (hard version) (DP)

    题目:https://vjudge.net/contest/325352#problem/C 题意:输入n,m,给你一个长度为n的串,然后你有一个集合,集合里面都是你的子序列,集合里面不能重复,集合中 ...

随机推荐

  1. [转]Creating an OData v3 Endpoint with Web API 2

    本文转自:https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata- ...

  2. mac平台安装配置TomCat

    1.下载Tomcat 7.0 地址:http://tomcat.apache.org/download-70.cgi Binary Distributions -> Core 选择zip或tar ...

  3. groovy集合

    groovy集合可以直接在语言中使用,因为它默认已经导入包了. 不需要初始化对象,也不需要专门的类. 集合是groovy语言本地成员.Groovy语法提供了本地列表和相应的映射. 每个Groovy集合 ...

  4. groovy运行程序和类型推断

    在 Java 中,如果要声明一个 String 变量,则必须输入: String value = "Hello World"; 等号右侧的字符已经表明 value 的类型是 Str ...

  5. React Native中的远程调试是不可靠的

    一.原因 当您发现rn app在关闭远程调试后,一些功能无法正常工作时,这很可能是由于设备上的JavaScript执行环境与远程调试器之间的细微差别造成的. 例如,日期问题,Date构造函数似乎接受C ...

  6. antd-mobile的按需加载

    "babel": { "presets": [ "react-app" ] } 主要问题是 依赖项的版本问题 以及 配置问题 新添加的con ...

  7. linq返回的IEnumerable<T>泛型不能被列举计算大于1次

    在分页获取Take后面加ToList()方法就能得到正确结果,为什么?

  8. 支持n多视频网站的下载,推荐 you-get

    其实刚开始是想下载youtube视频, 网上找了下 其中之一:http://jingyan.baidu.com/article/39810a23d2deb2b637fda66c.html 访问一个在线 ...

  9. error C3861: “getpid”: 找不到标识符

    原文:http://blog.csdn.net/woniu199166/article/details/52471242 这种错误一般就是没有对应的函数或者对应的头文件 旧版的vs添加#include ...

  10. Android 图片缩略图显示

    //通过openRawResource获取一个inputStream对象 InputStream inputStream = getResources().openRawResource(R.draw ...