码迷,mamicode.com
首页 > 编程语言 > 详细

算法训练 K好数

时间:2020-02-14 18:22:30      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:个数   div   动态   scan   算法   位置   ext   循环   次数   

问题描述

如果一个自然数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。

代码

#include <stdio.h>
#define M 1000000007
int main() {
int K,L,i,j,k,sum=0;
scanf("%d %d",&K,&L);
int a[200][200];
for(i=0;i<K;i++)
a[1][i]=1;
for(i=2;i<=L;i++) {
for(j=0;j<K;j++) {
for(k=0;k<K;k++)
{
if((j!=k-1)&&(j!=k+1))
{
a[i][j]+=a[i-1][k];
a[i][j]%=M;
}
}
}
}
for(i=1;i<K;i++)
{
sum+=a[L][i];
sum%=M;
}
printf("%d",sum);
return 0;
}

思考

一开始没看懂k好数是个什么,想遍历再带个计数器选择

看不懂放弃挣扎百度去了(注定咸鱼.jpg

动态规划 将L位从最后一位依次拆开比较 统计 用一个二维数组a[i][j] i指的是此时位于哪位 j指的是位置放j 整体数组值指的是有i位且该位是j时的概率

所以就相当于从小到大了 先初始化1位时 概率次数只能为1 然后作个循环再累加上

但我不知道为什么要除两次数。。我感觉除够了 但会溢出

犯了很多很傻的错 for和if里的结构体(?)忘了打{}  二维数组定义过小也有溢出

还是要明白思想

算法训练 K好数

标签:个数   div   动态   scan   算法   位置   ext   循环   次数   

原文地址:https://www.cnblogs.com/shawu/p/12308296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!