16蓝桥杯算法训练—K好数

    xiaoxiao2021-03-25  174

    import java.util.Scanner; /*算法训练 K好数  : 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字, 那么我们就说这个数是K好数。求L位K进制数中K好数的数目。 例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。 由于这个数目很大,请你输出它对1000000007取模后的值。 输入格式 输入包含两个正整数,K和L。 输出格式 输出一个整数,表示答案对1000000007取模后的值。 样例输入 4 2 样例输出 7 数据规模与约定 对于30%的数据,KL <= 106; 对于50%的数据,K <= 16, L <= 10; 对于100%的数据,1 <= K,L <= 100。 */ public class K_GoodNum  {  public static void main(String[] args)   {   //数据输入   Scanner s1 = new Scanner(System.in);   Scanner s2 = new Scanner(s1.nextLine());   int kl[] = new int[2];   int len=0;   while(s2.hasNext())   { kl[len] = s2.nextInt(); len++;   }      int k=kl[0];   int l=kl[1];   int sum=0;      if(k>=1 && l<=100)   {  int ii=1; //确定循环的最大范围  for(int i=0; i<l; i++)  {   ii = ii*10;  }    //进入循环,筛选所有K进制的数  for(int i=ii/10; i<ii; i++)  {   if(i >= k*10)    break;      if(i >= ((int)(i/10))*10+k)    continue;      if(screen(String.valueOf(i).toCharArray()) == false)   continue;      sum++;  }    //k进制整数的个数在所有l位整数中占的比例  double k_num = (double)sum/((double)(ii-ii/10));   //      对于30%的数据,KL <= 106;  if(k_num == 0.3)  {  if(k>106 || l>106)  return;  }   //      对于50%的数据,K <= 16, L <= 10;  if(k_num == 0.5)  {  if(k>16 || l>10)  return;  }    System.out.println(sum00000007); }   }  //对邻位进行筛选  public static boolean  screen(char arr[])  { boolean flag = true;   for(int i=1; i<arr.length; i++) { if(arr[i]+1 == arr[i-1] || arr[i]-1 == arr[i-1]) { flag = false; break; } } return flag;  } }
    转载请注明原文地址: https://ju.6miu.com/read-10438.html

    最新回复(0)