zoukankan      html  css  js  c++  java
  • 北邀 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 ≤ 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
    ",t,ans);
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    MySQL注入总结
    使用JavaScript扫描端口
    dvwa+xampp搭建显示乱码的问题:解决办法
    精读《12 个评估 JS 库你需要关心的事》
    TinyMCE上传图片word
    xhEditor上传图片word
    JAVA大文件(100G以上)的上传下载实现技术
    JAVA大文件(1G以上)的上传下载实现技术
    java 支持 超大上G,多附件上传问题
    java 支持 超大上G,多附件上传方法
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3747502.html
Copyright © 2011-2022 走看看