BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985
题目大意:问n长度的串用0~k的数字去填,有多少个串保证任意子串中不包含0~k的某一个全排列
邀请赛上A的较多的一道题,比赛的时候死活想不出,回来之后突然就想通了,简直..... = =!
解题思路:
对于所有串我们都只考虑末尾最多有多少位能构成全排列的一部分(用l来表示),即最多有多少位不重复的数字出现,将问题转化为求末尾最多有k位能构成全排列的串的总数量
假设k为5,有一个串……0023,不难发现l=3
我们以这个串出发在之后添上数字,假如我们添的是0、2、3中的一个:
0: ……00230 (l=3)
2: ……00232 (l=2)
3: ……00233 (l=1)
假如是l长度中没有出现过的数字
则构成新串 ……00231 ……00234 ……00235 l=4
最后可以得到规律:总长度为n串中 l=m的串的数量 x1 得到 总长度为n+1的串中 l=(1,2,……,m)的串
总长度为n串中 l=m的串的数量 x(k-m+2) 得到 总长度为n+1的串中 l=m+1的串
用mar[i][j]来表示由l=j的串得到l=i的串所以
mar可以表示为(以k=5为例)
1 1 1 1 1
5 1 1 1 1
0 4 1 1 1
0 0 3 1 1
0 0 0 2 1
通过该矩阵我们可以由长度为n的串数量可以推出长度为n+1的串的数量:
于是我们可以通过长度1的串最终得到总长度为n的串, n=1时只有l最多为1 总数为 k+1
快速幂求得该矩阵的(n-1)次幂,该矩阵的第一列相加乘(k+1)即为最终结果
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define FFF 20140518
struct node{
long long mar[][];
}sor;
void init(int k)
{
memset(sor.mar,,sizeof(sor.mar));
for(int i=;i<=k;i++)
{
for(int j=i;j<=k;j++)
{
sor.mar[i][j]=;
}
if(i>)
{
sor.mar[i][i-]=k-i+;
}
}
}
node marMulti(node a,node b,int k)
{
node ret;
memset(ret.mar,,sizeof(ret.mar));
for(int i=;i<=k;i++)
{
for(int j=;j<=k;j++)
{
for(int l=;l<=k;l++)
{
ret.mar[i][j]+=(a.mar[i][l]*b.mar[l][j])%FFF;
ret.mar[i][j]%=FFF;
}
}
}
return ret;
}
node matrixPow(long long x,int k)
{
node now=sor;
node ret;
memset(ret.mar,,sizeof(ret.mar));
for(int i=;i<=k;i++)
ret.mar[i][i]=;
while(x)
{
if(x%==)
ret=marMulti(now,ret,k);
x/=;
now=marMulti(now,now,k);
}
return ret;
}
void print(node sor,int k)
{
for(int i=;i<=k;i++)
{
for(int j=;j<=k;j++)
{
cout<<sor.mar[i][j]<<' ';
}
cout<<endl;
}
}
int main()
{
int keng,k,Case=;
long long n;
scanf("%d",&keng);
while(keng--)
{
scanf("%lld%d",&n,&k);
init(k);
node ret=matrixPow(n-,k);
int ans=;
// print(sor,k);
// print(ret,k);
for(int i=;i<=k;i++)
{
ans+=(ret.mar[i][]*(k+))%FFF;
ans%=FFF;
}
printf("Case #%d: %d\n",Case++,ans);
}
return ;
}
BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂的更多相关文章
- bnuoj 34985 Elegant String DP+矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...
- bnuoj 16493 Just Pour the Water(矩阵快速幂)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=16493 [题解]:矩阵快速幂 [code]: #include <cstdlib> #i ...
- 徐州邀请赛 江苏 icpc I. T-shirt 矩阵快速幂
题目 题目描述 JSZKC is going to spend his vacation! His vacation has N days. Each day, he can choose a T-s ...
- 【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)
[解题思路] 给一张神图,推理写的灰常明白了,关键是构造共轭函数,这一点实在是要有数学知识的理论基础,推出了递推式,接下来就是矩阵的快速幂了. 神图: 给个大神的链接:构造类斐波那契数列的矩阵快速幂 ...
- hihocoder 1084 扩展KMP && 2014 北京邀请赛 Justice String
hihocoder 1084 : http://hihocoder.com/problemset/problem/1084 北京邀请赛 Just String http://www.bnuoj.co ...
- 2014 北京邀请赛ABDHJ题解
A. A Matrix 点击打开链接 构造,结论是从第一行開始往下产生一条曲线,使得这条区间最长且从上到下递减, #include <cstdio> #include <cstrin ...
- HDU5863 cjj's string game(DP + 矩阵快速幂)
题目 Source http://acm.split.hdu.edu.cn/showproblem.php?pid=5863 Description cjj has k kinds of charac ...
- ACM学习历程——HDU5015 233 Matrix(矩阵快速幂)(2014陕西网赛)
Description In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 2 ...
- 2019南昌邀请赛 C. Angry FFF Party 大数矩阵快速幂+分类讨论
题目链接 https://nanti.jisuanke.com/t/38222 题意: 定义函数: $$F(n)=\left\{\begin{aligned}1, \quad n=1,2 \\F(n- ...
随机推荐
- js--Ajax的小知识(二):处理ajax的session过期的请求
问题的产生: 现如今Ajax在Web项目中应用广泛,几乎可以说无处不在. 有时会碰到这样个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax ...
- Android运行异常情况分析(持续更新)
1.java.lang.IllegalAccessException: access to class not allowed 原因:在写class 文件的时候没有把class设置成public 2. ...
- 242. Valid Anagram(C++)
242. Valid Anagram Given two strings s and t, write a function to determine if t is an anagram of s. ...
- State 模式
State模式中我们将状态逻辑和动作实现进行分离.允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类:在一个状态即将结束的时候启用下一个状态. /////////state.h// ...
- Jquery 实现瀑布流功能
实现展示地址:http://sandbox.runjs.cn/show/mbojrgag 源码地址:http://runjs.cn/code/qps1jebl 效果截图:
- input单选框全选与反选
input单选框全选与反选 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- ubuntu 14.04安装quickbuild server (一)
官网: http://www.pmease.com/ 指导网站: http://wiki.pmease.com/display/QB60/ 1. 安装quickbuild server ------ ...
- Android中基于Socket的网络通信
1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...
- linux之GDB常用命令汇总
查看gdb的版本号 (1)rpm -q gdb 会显示是否安装gdb及版本号 (2)gdb --version也可以 breakpoint b main; b 20; 设置断点 breakpoint ...
- java怎么连接sql server,需要注意的几点
一.JAVA连接SQL的语句 JAVA连接SQL2000语句为: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Drive ...