HDU 5318——The Goddess Of The Moon——————【矩阵快速幂】
The Goddess Of The Moon
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 589 Accepted Submission(s): 251

However, while Yi went out hunting, Fengmeng broke into his house and forced Chang'e to give up the elixir of immortality to him, but she refused to do so. Instead, Chang'e drank it and flew upwards towards the heavens, choosing the moon as residence to be nearby her beloved husband.

Yi discovered what had transpired and felt sad, so he displayed the fruits and cakes that his wife Chang'e had liked, and gave sacrifices to her. Now, let’s help Yi to the moon so that he can see his beloved wife. Imagine the earth is a point and the moon is also a point, there are n kinds of short chains in the earth, each chain is described as a number, we can also take it as a string, the quantity of each kind of chain is infinite. The only condition that a string A connect another string B is there is a suffix of A , equals a prefix of B, and the length of the suffix(prefix) must bigger than one(just make the joint more stable for security concern), Yi can connect some of the chains to make a long chain so that he can reach the moon, but before he connect the chains, he wonders that how many different long chains he can make if he choose m chains from the original chains.
Each of the test case begins with two integers n, m.
(n <= 50, m <= 1e9)
The following line contains n integer numbers describe the n kinds of chains.
All the Integers are less or equal than 1e9.
11 111 is different with 111 11
题目大意:有t组数据。每组数据有n,m。分别表示有n种类型的字串(可能重复),每种字串无限多个。问你如果从这些字串中挑出m个连成一串。问能形成多少种字串。能连接的要求是前边那个串的后缀跟后边那个串的前缀重复最少2个字符。(连接成新的字串时直接连接,不用重叠)。
解题思路:定义dp[i][j]表示选出前i个字串以j字串为结尾的种数。首先定义a[i][j]表示j字串可以连接在i字串后边。dp[i][j]+=dp[i][k]*a[k][j] (1<=k<=n)。然后用矩阵快速幂去优化矩阵相乘。
#include<stdio.h>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
using namespace std;
const int MOD=1000000007;
typedef long long INT;
int n,m;
char str[55][12];
struct Matrix{
int a[55][55];
Matrix(){
memset(a,0,sizeof(a));
}
void init(){
for(int i=1;i<=n;i++)
a[1][i]=1;
}
Matrix operator *(Matrix &X)const {
Matrix ret;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
ret.a[i][j]=(ret.a[i][j]%MOD+((INT)a[i][k]*X.a[k][j])%MOD)%MOD;
}
}
}
return ret;
}
};
Matrix &Pow(Matrix &ret,Matrix a,int x){
while(x){
if(x&1){
ret=ret*a;
}
x>>=1;
a = a * a;
}
return ret;
}
bool check(int x,int y){//检查是否能连接
int lenx=strlen(str[x]),leny=strlen(str[y]);
if(lenx==1||leny==1)
return 0;
for(int i=lenx-2;i>=0;i--){
int ii=i,jj=0;
while(ii<lenx&&jj<leny&&str[x][ii]==str[y][jj]){
ii++,jj++;
}
if(ii==lenx){
return 1;
}
}
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
Matrix A,B;
scanf("%d%d",&n,&m);
set<string>ST;
ST.clear();
for(int i=1;i<=n;i++){
scanf("%s",str[i]);
ST.insert(str[i]);
}
n=0;
for(set<string>::iterator it=ST.begin();it!=ST.end();it++){
strcpy(str[++n],(*it).c_str());
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(check(i,j))
A.a[i][j]=1;
}
}
B.init();
Pow(B,A,m-1);
int res=0;
for(int i=1;i<=n;i++){
res=(res%MOD+B.a[1][i]%MOD)%MOD;
}
printf("%d\n",res); }
return 0;
}
下面这个代码时间快得很。
#include<bits/stdc++.h>
using namespace std;
const int MOD=1000000007;
typedef long long INT;
int n,m;
char str[55][12];
struct Matrix{
int a[55][55];
Matrix(){
memset(a,0,sizeof(a));
}
void init(){
for(int i=1;i<=n;i++)
a[1][i]=1;
}
Matrix operator *(Matrix &X)const {
Matrix ret;
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
if(a[i][k])
for(int j=1;j<=n;j++){
if(X.a[k][j])
ret.a[i][j]=(ret.a[i][j]%MOD+((INT)a[i][k]*X.a[k][j])%MOD)%MOD;
}
}
}
return ret;
}
};
Matrix &Pow(Matrix &ret,Matrix a,int x){
// while(x){
// if(x&1){
// ret=ret*a;
// }
// x>>=1;
// a = a * a;
// }
for(;x;x>>=1,a=a*a)
if(x&1)
ret=ret*a;
return ret;
}
bool check(int x,int y){
int lenx=strlen(str[x]),leny=strlen(str[y]);
if(lenx==1||leny==1)
return 0;
for(int i=lenx-2;i>=0;i--){
int ii=i,jj=0;
while(ii<lenx&&jj<leny&&str[x][ii]==str[y][jj]){
ii++,jj++;
}
if(ii==lenx){
return 1;
}
}
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
Matrix A,B;
scanf("%d%d",&n,&m);
set<string>ST;
ST.clear();
for(int i=1;i<=n;i++){
scanf("%s",str[i]);
ST.insert(str[i]);
}
n=0;
for(set<string>::iterator it=ST.begin();it!=ST.end();it++){
strcpy(str[++n],(*it).c_str());
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(check(i,j))
A.a[i][j]=1;
}
}
B.init();
Pow(B,A,m-1);
int res=0;
for(int i=1;i<=n;i++){
res=(res%MOD+B.a[1][i]%MOD)%MOD;
}
printf("%d\n",res); }
return 0;
}
HDU 5318——The Goddess Of The Moon——————【矩阵快速幂】的更多相关文章
- hdu 5318 The Goddess Of The Moon 矩阵高速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS ( ...
- 2015 Multi-University Training Contest 3 hdu 5318 The Goddess Of The Moon
The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- HDU 1757 A Simple Math Problem(矩阵快速幂)
题目链接 题意 :给你m和k, 让你求f(k)%m.如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + …… ...
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- (hdu 6030) Happy Necklace 找规律+矩阵快速幂
题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6030 Problem Description Little Q wants to buy a nec ...
- hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!
http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE, 更重要的是找出规律后,O(n)递推也过不了,TLE,一定 ...
- hdu 4291 2012成都赛区网络赛 矩阵快速幂 ***
分析:假设g(g(g(n)))=g(x),x可能非常大,但是由于mod 10^9+7,所以可以求出x的循环节 求出x的循环节后,假设g(g(g(n)))=g(x)=g(g(y)),即x=g(y),y也 ...
- hdu 1757 A Simple Math Problem (矩阵快速幂,简单)
题目 也是和LightOJ 1096 和LightOJ 1065 差不多的简单题目. #include<stdio.h> #include<string.h> #include ...
- 2017ACM暑期多校联合训练 - Team 2 1006 HDU 6050 Funny Function (找规律 矩阵快速幂)
题目链接 Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e ...
随机推荐
- NSValue 值
前言 将任意数据类型包装成 OC 对象 1.比较两个 NSValue 类型数据的大小 NSValue *value1 = [NSValue valueWithPoint:NSMakePoint(10, ...
- Flutter的使用教学笔记
QQ交流群 Flutter 程序开发群:766307130 教程 官方实战 使用Flutter 构建精美的页面 云在千峰 博主一直是从事 Android 开发的,所以主要从 Android 技术角度来 ...
- 解决eclipse Building workspace(Sleeping)闪烁
出现这个是因为我,把两个有错的项目.从工程里面删除掉之后,再接着运行新的工程,但是Building workspace一直没有执行完毕,导致新的工程无法运行. 这个时候可以关闭自动编译,就可以运行新的 ...
- Java面向对象之继承extends 入门实例
一.基础概念 (一)继承的好处: 1.继承:提高了代码的复用性. 2.让类与类之间产生了关系,给多态这个特征提供了前提. (二)继承的种类: 1.单继承:一个类只能有一个父类. 2.多继承:一个类可以 ...
- centos7用docker安装kafka
参考之前的文章安装zookeeper集群 https://www.cnblogs.com/xiaohanlin/p/10124674.html 如果是测试环境也可以简单安装单节点的zookeeper ...
- SDUT OJ 数据结构实验之串三:KMP应用
数据结构实验之串三:KMP应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- C# 使用List<T> 内存溢出
class Program { static void Main(string[] args) { var all = new List< ...
- IOS中NSUserDefaults的用法
NSUserDefaults适合存储轻量级本地数据,比如要保存用户登陆的用户名.密码,使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefaults里面读取上次登陆的 ...
- JS 只创建一个元素
//判断有没有这个元素<div id="div"> if(my$("div").firstElementChild){ console.log(&q ...
- Qt 学习之路 2(51):布尔表达式树模型
Qt 学习之路 2(51):布尔表达式树模型 豆子 2013年5月15日 Qt 学习之路 2 17条评论 本章将会是自定义模型的最后一部分.原本打算结束这部分内容,不过实在不忍心放弃这个示例.来自于 ...