北邀 E Elegant String

E. Elegant String

1000ms
1000ms
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 ≤ 10 18) 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 }

 

你可能感兴趣的:(String)