HDU 5318 The Goddess Of The Moon

来源:互联网 发布:2017金英杰免费网络课 编辑:程序博客网 时间:2024/04/30 23:38

题目:说了个后羿的传说。。。

     给你n种串,可以重复使用,要你用m个串连成一个长的串,问你会用多少种不一样的长串,,,两个串 a , b 可以相连的条件是a的结尾跟b的开头的字符要一样,一样的字符的长度大于2就行    如  121  跟 213   但121 跟 123 就不行,当然121跟121也行

11 111与111 11 连接的时候算两种

思路:构造一个可以矩阵m[i][j]代表以i串开头,j串结尾的串的种数;


#include <cstdio>#include <iostream>#include <queue>#include <cstring>#include <algorithm>using namespace std;#define ll long longconst int N = 55;const int mod = 1e9+7;int n,m;int num[N],t[N];struct mat{ll m[N][N];mat(){memset(m,0,sizeof(m));}void E(){for(int i = 0; i < N; i++){m[i][i] = 1;}}};mat multiply(mat a, mat b){mat ret;for(int i = 0; i < m; i++){for(int j = 0; j < m; j++){for(int k = 0; k < m; k++){ret.m[i][j]=(ret.m[i][j]+a.m[i][k]*b.m[k][j])%mod;}}}return ret;}mat q_pow(mat a,int k){mat ret;ret.E();while(k){if(k&1){ret = multiply(ret,a);}a = multiply(a,a);k=k>>1;}return ret;}void init_hash(){for(int i = 0; i < n; i++){t[i] = num[i];}m = unique(t,t+n)-t;}bool judge(int x,int y){char s1[15], s2[15];sprintf(s1,"%d",x);sprintf(s2,"%d",y);int l1 = strlen(s1), l2 = strlen(s2);int l = min(l1,l2);if(l<2)return false;for(int i = 2; i <= l; i++){int k = i;bool  flag = true;while(k){if(s1[l1-k] != s2[i-k]){flag = false;break;}k--;}if(flag)return true;}return false;}mat getmat(){mat ret;for(int i = 0; i < m; i++){for(int j = 0; j < m; j++){if(judge(t[i], t[j])){ret.m[i][j] = 1;}}}return ret;}int main(){//freopen("in.txt","r",stdin);int T,M;scanf("%d",&T);while(T--){scanf("%d%d",&n,&M);for(int i = 0; i < n; i++){scanf("%d",num+i);}sort(num,num+n);init_hash();mat x = getmat();mat ret = q_pow(x, M-1);ll ans = 0;        for (int i = 0; i < m; i++)            for (int j = 0; j < m; j++)                ans = (ans + ret.m[i][j]) % mod;printf("%I64d\n", ans);}return 0;}


0 0