2015 多校联赛 ——HDU5302(矩阵快速幂)

时间:2021-09-02 04:27:24

The Goddess Of The Moon

Sample Input
2
10 50
12 1213 1212 1313231 12312413 12312 4123 1231 3 131
5 50
121 123 213 132 321
 
Sample Output
86814837
797922656

题意:给你n个字符串,若是一个的后缀与一个的前缀相同的大于1,则表示这两个可以连接到一起,问M个字符串相连的方案数

若a  b可以合并,可以让他们相连,然后求在一个图中走m-1步的方案数,

两点之间所走的步数为m-1的不同走法有多少种——矩阵快速幂的经典问题

因为求不同方案--->去重

(在别人博客看到的,表示以前并不知道这个,既然有点像模板题,写写学习下)

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; const int maxn = 55;
const int mod = 1e9+7; int n, m, a[maxn]; struct Mat
{
int s[maxn][maxn];
Mat ()
{
memset(s, 0, sizeof(s));
}
Mat operator * (const Mat& b)
{
Mat ret;
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
ret.s[i][j] = (ret.s[i][j] + 1LL * s[i][k] * b.s[k][j] % mod) % mod;
}
}
return ret;
}
}; bool work(int a,int b)
{
char p[15], q[15];
sprintf(p, "%d", a);
sprintf(q, "%d", b); int l1 = strlen(p);
int l2 = strlen(q);
for(int i = 0; i < l1; i++)
{
int k = 0;
while(i + k < l1 && k < l2 && p[i+k] == q[k])
{
k++;
}
if(i + k == l1 && k > 1)
return true;
}
return false;
} Mat solve()
{
Mat lp;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(work(a[i],a[j]))
lp.s[i][j] = 1;
}
return lp;
} Mat pow_mat(Mat x, int z)
{
Mat ret;
for (int i = 0; i < n; i++)
ret.s[i][i] = 1;
while (z)
{
if (z&1)
ret = ret * x;
x = x * x;
z >>= 1;
}
return ret;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m); for(int i = 0; i <n; i++)
scanf("%d",&a[i]);
sort(a,a+n);
n = unique(a,a+n) - a; if (n == 0 || m == 0)
{
printf("0\n");
continue;
}
Mat tp = solve();
Mat tmp = pow_mat(tp,m-1); long long ans = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
ans = (long long)(ans + tmp.s[i][j])%mod;
printf("%I64d\n",ans);
}
} 主要部分: struct Matrix {
LL m[55][55];
};
Matrix init; Matrix MatrixMul(Matrix a, Matrix b){
Matrix c;
int i,j,k;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
c.m[i][j]=0;
for(k=0;k<N;k++){
c.m[i][j]+=(a.m[i][k]*b.m[k][j]);
c.m[i][j]%=kmod;
}
}
}
return c;
} Matrix QuickPow(Matrix m,int p){
Matrix b;
int i;
memset(b.m,0,sizeof b.m);
for(i=0;i<N;i++)
b.m[i][i]=1;
while(p){
if(p%2) b=MatrixMul(b,m);
p/=2;
m=MatrixMul(m,m);
}
return b;
}

  

2015 多校联赛 ——HDU5302(矩阵快速幂)的更多相关文章

  1. 2015 多校联赛 ——HDU5363(快速幂)

    Problem Description soda has a set S with n integers {1,2,…,n}. A set is called key set if the sum o ...

  2. 广工十四届校赛 count 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...

  3. 2015 多校联赛 ——HDU5302(构造)

    Connect the Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  4. 杭电多校第七场 1010 Sequence(除法分块&plus;矩阵快速幂)

    Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ...

  5. 五校联考R1 Day1T3 平面图planar&lpar;递推 矩阵快速幂&rpar;

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

  6. 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)

    题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...

  7. HDU-6395 多校7 Sequence(除法分块&plus;矩阵快速幂)

    Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. generator 1&lpar;2019年牛客多校第五场B题&plus;十进制矩阵快速幂&rpar;

    目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...

  9. HDU 5863 cjj&&num;39&semi;s string game &lpar; 16年多校10 G 题、矩阵快速幂优化线性递推DP &rpar;

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

随机推荐

  1. C&num;委托的介绍&lpar;delegate、Action、Func、predicate&rpar; --转载

    来源:http://www.cnblogs.com/akwwl/p/3232679.html 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1 ...

  2. job不自动运行解决方法

    一.plsql.新建命令窗口 用查询语句: show parameter job_queue_processes 看看job_queue_processes的值 如果你的job很多那么将这个值设大,5 ...

  3. IOS 点击按钮 光环 冲击波效果

    UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(0, 0) radius:ROUND_WIDTH/2 - ...

  4. canvas 俄罗斯方块

    <!doctype html> <html> <body> <canvas id="can" width="360px&quot ...

  5. Microsoft Visual Studio Professional 2012 专业版 下载

    记录(以下内容来自网络收集): 下载地址: https://www.microsoft.com/zh-cn/download/details.aspx?id=30682 直接iso连接下载址: htt ...

  6. SpringSecurity数据库中存储用户、角色、资源

    这几天项目中用到了SpringSecurity做登陆安全.所以在这写一下也许可以帮助一下其他人,自己也熟悉一下 SpringSecurity配置文件如下: <beans:beans xmlns= ...

  7. 基于web的网上书城系统开发-----登录注册

    注册功能实现 signup.jsp //时间实现 function showLocale(objD) { var str,colorhead,colorfoot; var yy = objD.getY ...

  8. C&plus;&plus;智能指针剖析(上)std&colon;&colon;auto&lowbar;ptr与boost&colon;&colon;scoped&lowbar;ptr

    1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...

  9. Windows7下Jupyter Notebook使用入门

    目录 一.Jupyter简介 二.Jupyter安装 2.1 python 3安装 2.2 Jupyter 安装 三.Jupyter使用示例 四.Jupyter常用命令 五.其他说明 一.Jupyte ...

  10. gitlab-ci的注意点

    在使用gitlab搭配gitlab-runner进行ci配置时,发现两个问题,略记如下备忘: 1. 若发现ci job控制台显示无法下载该项目,但当前提交代码人和ci用户都确实具备该项目的访问权限时, ...