首页 > 代码库 > 北邀 E Elegant String

北邀 E Elegant String

E. Elegant String

1000ms
1000ms
65536KB
 
64-bit integer IO format: %lld      Java class name: Main
Submit Status PID: 34985
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 }