E. Elegant String
Time Limit: 1000ms
Case Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO
format: %lld Java class
name: Main
Font Size: + -
We define a kind of strings as elegant string: among all the substrings of
an elegant string, none of them is a permutation of "0, 1,…, k".
Let function(n, k) be the number of elegant strings of length n which only
contains digits from 0 to k (inclusive). Please calculate function(n, k).
Input
Input starts with an integer T (T ≤ 400), denoting the number of test
cases.
Each case contains two integers, n and k. n (1 ≤ n ≤ 1018)
represents the length of the strings, and k (1 ≤ k ≤ 9) represents the biggest
digit in the string.
Output
For each case, first output the case number as "Case #x: ",
and x is the case number. Then output function(n, k) mod 20140518 in this
case.
Sample Input
2
1 1
7 6
Sample Output
Case #1: 2
Case #2: 818503
1 #include<iostream>
2 #include<stdio.h>
3 #include<cstring>
4 #include<cstdlib>
5 using namespace std;
6 typedef long long LL;
7
8 const LL p = 20140518;
9 struct Matrix
10 {
11 LL mat[11][11];
12 void init()
13 {
14 memset(mat,0,sizeof(mat));
15 }
16 void first(int n)
17 {
18 int i,j;
19 for(i=1;i<=n;i++)
20 for(j=1;j<=n;j++)
21 if(i==j)mat[i][j]=1;
22 else mat[i][j]=0;
23 }
24 }M_hxl,M_tom;
25 Matrix multiply(Matrix cur,Matrix ans,int n)
26 {
27 Matrix now;
28 now.init();
29 int i,j,k;
30 for(i=1;i<=n;i++)
31 {
32 for(k=1;k<=n;k++)
33 {
34 for(j=1;j<=n;j++)
35 {
36 now.mat[i][j]=now.mat[i][j]+cur.mat[i][k]*ans.mat[k][j];
37 now.mat[i][j]%=p;
38 }
39 }
40 }
41 return now;
42 }
43 Matrix pow_mod(Matrix ans,LL n,LL m)
44 {
45 Matrix cur;
46 cur.first(m);
47 while(n)
48 {
49 if(n&1) cur=multiply(cur,ans,m);
50 n=n>>1;
51 ans=multiply(ans,ans,m);
52 }
53 return cur;
54 }
55 LL solve(LL n,LL k)
56 {
57 M_hxl.init();
58 int i,j;
59 for(i=1;i<=k-1;i++)M_hxl.mat[1][i]=1;
60 for(i=2;i<=k-1;i++)
61 {
62 for(j=1;j<=k-1;j++)
63 {
64 if(i-j>1)continue;
65 if(i-j==1) M_hxl.mat[i][j]=k-i+1;
66 else M_hxl.mat[i][j]=1;
67 }
68 }/**ok**/
69 M_tom = pow_mod(M_hxl,n,k-1);
70 LL sum=(M_tom.mat[1][1]*k)%p;
71 return sum;
72
73 }
74 int main()
75 {
76 int T,t;
77 LL n,k;
78 scanf("%d",&T);
79 for(t=1;t<=T;t++)
80 {
81 scanf("%lld%lld",&n,&k);
82 k++;
83 LL ans=solve(n,k);
84 printf("Case #%d: %lld\n",t,ans);
85 }
86 return 0;
87 }
北邀 E Elegant String