HDU 5318 The Goddess Of The Moon
2015-08-01 14:17
555 查看
题目:说了个后羿的传说。。。
给你n种串,可以重复使用,要你用m个串连成一个长的串,问你会用多少种不一样的长串,,,两个串 a , b 可以相连的条件是a的结尾跟b的开头的字符要一样,一样的字符的长度大于2就行 如 121 跟 213 但121 跟 123 就不行,当然121跟121也行
11 111与111 11 连接的时候算两种
思路:构造一个可以矩阵m[i][j]代表以i串开头,j串结尾的串的种数;
给你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 long const int N = 55; const int mod = 1e9+7; int n,m; int num ,t ; struct mat{ ll m ; 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; }
相关文章推荐
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 1000
- HDU 1001
- HDU 1622 Trees On The Level
- HDU 1063 Exponentiation
- Hdu5033
- HDU 1166 敌兵布阵
- HDU Rightmost Digit
- hdu 1002
- 贪心 hdu 1003
- hdu 1004