引例: Matrix Power Series

题目大意,给定矩阵A,求A^+A^+A^+...A^N。
题解:已知X=a,可以通过以下矩阵求出ans=a^+a^+...a^N ans=矩阵^n后第一行之和-=矩阵^(n+)后右上格的和-。
同理:矩阵也可以,只需要把1改为单位矩阵元即可。

左图a是常数,1就是1; 右图A是矩阵,1是单位元矩阵(主对角线是1)。

          

代码1:矩阵^N,第一行之和-1。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int N,K,Mod;
struct mat
{
int mp[maxn][maxn],len;
mat(int x){ len=x; memset(mp,,sizeof(mp)); }
mat friend operator *(mat a,mat b)
{
mat res(a.len);
for(int k=;k<=res.len;k++)
for(int i=;i<=res.len;i++)
for(int j=;j<=res.len;j++)
res.mp[i][j]=(res.mp[i][j]+a.mp[i][k]*b.mp[k][j])%Mod;
return res;
}
mat friend operator ^(mat a,int x)
{
mat res(a.len);
for(int i=;i<=res.len;i++) res.mp[i][i]=;
while(x){
if(x&)res=res*a; a=a*a; x>>=;
} return res;
}
};
int main()
{
scanf("%d%d%d",&N,&K,&Mod);
mat array(N+N);
for(int i=;i<=N;i++)
for(int j=;j<=N;j++){
scanf("%d",&array.mp[i][j]);
}
for(int i=;i<=N;i++) array.mp[i][i+N]=array.mp[i+N][i+N]=;
array=array^(K);
for(int i=;i<=N;i++) array.mp[i][i+N]-=;
for(int i=;i<=N;i++){
for(int j=;j<N;j++)
printf("%d ",(array.mp[i][j]+array.mp[i][j+N]+Mod)%Mod);
printf("%d\n",(array.mp[i][N]+array.mp[i][N+N]+Mod)%Mod);
}
return ;
}

代码2:矩阵^N+1,右上格之和-1。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int N,K,Mod;
struct mat
{
int mp[maxn][maxn],len;
mat(int x){ len=x; memset(mp,,sizeof(mp)); }
mat friend operator *(mat a,mat b)
{
mat res(a.len);
for(int k=;k<=res.len;k++)
for(int i=;i<=res.len;i++)
for(int j=;j<=res.len;j++)
res.mp[i][j]=(res.mp[i][j]+a.mp[i][k]*b.mp[k][j])%Mod;
return res;
}
mat friend operator ^(mat a,int x)
{
mat res(a.len);
for(int i=;i<=res.len;i++) res.mp[i][i]=;
while(x){
if(x&)res=res*a; a=a*a; x>>=;
} return res;
}
};
int main()
{
scanf("%d%d%d",&N,&K,&Mod);
mat array(N+N);
for(int i=;i<=N;i++)
for(int j=;j<=N;j++){
scanf("%d",&array.mp[i][j]);
}
for(int i=;i<=N;i++) array.mp[i][i+N]=array.mp[i+N][i+N]=;
array=array^(K+);
for(int i=;i<=N;i++) array.mp[i][i+N]-=;
for(int i=;i<=N;i++){
for(int j=;j<N;j++)
printf("%d ",(array.mp[i][j+N]+Mod)%Mod);
printf("%d\n",(array.mp[i][N+N]+Mod)%Mod);
}
return ;
}

代码3:利用二分。

--------------------分界线---------------------------

例题:HDU2243:考研路茫茫——单词情结

题意:问长度位1到L的所有单词中,有多少个不含给出的几个单词。
思路:利用矩阵得到可以26的1到N次幂。然后利用AC自动机得到基本矩阵X,再利用矩阵得到得到X^+X^+X^...X^N。
比如得到26的0到N次幂和,就有矩阵a[][]=,a[][]=,a[][]=,a[][]=;
矩阵^N后,第一行的和就是答案。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ull unsigned long long
const int maxn=;
int ch[maxn][],cnt;
int q[maxn],head,tail,Next[maxn],tag[maxn];
char s[];
struct mat
{
ull mp[maxn][maxn];
mat(){memset(mp,,sizeof(mp));}
mat init(){ memset(mp,,sizeof(mp));}
mat friend operator *(mat a,mat b)
{
mat res;
for(int k=;k<=max(cnt,);k++)
for(int i=;i<=max(cnt,);i++)
for(int j=;j<=max(cnt,);j++)
res.mp[i][j]+=a.mp[i][k]*b.mp[k][j];
return res;
}
mat friend operator ^(mat a,int x)
{
mat res;
for(int i=;i<=cnt;i++)
res.mp[i][i]=;
while(x){
if(x&) res=res*a;
a=a*a; x>>=;
} return res;
}
}; mat array; struct ACautom
{
void update()
{
cnt=head=tail=;
memset(Next,,sizeof(Next));
memset(tag,,sizeof(tag));
memset(ch,,sizeof(ch));
array.init();
}
void insert()
{
int Now=;
for(int i=;s[i];i++){
int x=s[i]-'a';
if(!ch[Now][x]) ch[Now][x]=++cnt;
Now=ch[Now][x];
} tag[Now]=;
}
void build()
{
for(int i=;i<;i++){
if(ch[][i]) q[++head]=ch[][i];
if(!tag[ch[][i]]) array.mp[][ch[][i]]++;
}
while(tail<head){
int u=q[++tail];
for(int i=;i<;i++){
if(ch[u][i]){
q[++head]=ch[u][i];
Next[ch[u][i]]=ch[Next[u]][i];
if(tag[Next[ch[u][i]]]) tag[ch[u][i]]=;
}
else ch[u][i]=ch[Next[u]][i];
if(!tag[ch[u][i]]) array.mp[u][ch[u][i]]++;
}
}
cnt++;
for(int i=;i<=cnt;i++) array.mp[i][cnt]=;
}
void qpow(int K)
{
ull ans,res=;
mat base;
base.mp[][]=; base.mp[][]=;
base.mp[][]=; base.mp[][]=;
base=base^K;
ans=base.mp[][]+base.mp[][];
array=array^K;
for(int i=;i<=cnt;i++) res=res+array.mp[][i];
cout<<ans-res<<endl;
}
}Trie;
int main()
{
int N,K;
while(~scanf("%d%d",&N,&K)){
Trie.update();
for(int i=;i<=N;i++) {
scanf("%s",s);
Trie.insert();
}
Trie.build();
Trie.qpow(K);
}
return ;
}

【矩阵---求A的1到N次幂之和】的更多相关文章

  1. [zt]矩阵求导公式

    今天推导公式,发现居然有对矩阵的求导,狂汗--完全不会.不过还好网上有人总结了.吼吼,赶紧搬过来收藏备份. 基本公式:Y = A * X --> DY/DX = A'Y = X * A --&g ...

  2. Ipad,IPhone(矩阵求递推项+欧拉定理)

    Ipad,IPhone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. AI 矩阵求导

    矩阵求导 参考链接: https://en.wikipedia.org/wiki/Matrix_calculus#Scalar-by-vector_identities

  4. CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】

    B. Powers of Two   You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i,  ...

  5. MATLAB矩阵求值和稀疏矩阵

    方阵的行列式: det(A) 矩阵线性无关的行数或列数,称为矩阵的秩. rank(A) 求3~20阶魔方矩阵的秩 for n=3:20 rank(magic(n)) end 矩阵的迹等于矩阵的对角线元 ...

  6. Tutte矩阵求一般图最大匹配

    [集训队2017论文集] 一张无向图的Tutte矩阵为 其中xi,j为一个random的值. Tutte矩阵的秩(一定为偶数)/2 就是这张图的最大匹配. 原理大概就是: 一个图有完美匹配,则det( ...

  7. 笔试算法题(26):顺时针打印矩阵 & 求数组中数对差的最大值

    出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字: 分析: 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作: 注意有四种打印模式(左右,上下,右左, ...

  8. POJ 3233 Matrix Power Series(构造矩阵求等比)

    Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. ...

  9. 行列有序矩阵求第k大元素

    问题来源:http://www.careercup.com/question?id=6335704 问题描述: Given a N*N Matrix. All rows are sorted, and ...

随机推荐

  1. Set 技巧之一

    我们知道set中 用set<int,int>S; S.lower_bound(x): 查找Set中 第一个>=x的数,返回结果是指针. S.upper_bound(x):查找Set中 ...

  2. idea抛异常方式

    选中需要抛异常的行,按alt+enter或者ctrl+alt+t,然后上下键选择自己抛异常的方式即可,如下图:

  3. 【J2EE】十三个规范:愿天下苍生,人人如猿。

    学习了J2ee后对java这个立足标准化的行为感到深深的佩服. 收买什么都不如收买人心,培养啥子都不如培养 习惯.没错,java就是在培养行业习惯,以一纸规范屹立不倒.毕竟技术什么的层出不穷,再新再前 ...

  4. CMS - 认识目录

    Tips:如果网页图片(文字)看不清,请按CTRL+鼠标滚轮 一个完整的小程序模板目录结构如下! 本章节给出的建议: 1.推荐使用flex布局 2.其它图片路径建议引入网络路径(tabBar不支持网络 ...

  5. 读取xml生成lua測试代码

    #include <iostream> #include <string> #include <fstream> #include "tinyxml2.h ...

  6. 机器学习技法总结(六)Decision Tree Hypothesis

    这里先再次提出我们利用aggregation获取更好性能的Hypothesis G所涉及的方法:blending,就是在得到g_set之后进行融合:learning呢?就是在线online的获取g并融 ...

  7. 组件接口(API)设计指南[2]-类接口(class interface)

    *返回文件夹阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 类接口(class interface) 你能够參考MGTi ...

  8. The user's guide what comes in the kernel Documentation directory

    The Linux IPMI Driver --------------------- Corey Minyard <minyard@mvista.com> <minyard@acm ...

  9. HDU 1398 Square Coins(母函数或dp)

    Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  10. 获取连接状态数的awk数组命令

    awk -n|more zhutianpeng@ztp-OptiPlex-:~/Icpp/server$ netstat -n|more 激活Internet连接 (w/o 服务器) Proto Re ...