1812: K好数
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 7 Solved: 3
[ Submit][ Status][ Web Board]
Description
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。
例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。
Input
输入包含两个正整数,K和L。1 < = K,L < = 100。
Output
输出一个整数,表示答案对1000000007取模后的值。
Sample Input
4 2
Sample Output
7
【解析】
数位DP...其实我们可以这么想,建一个二维数组dp[i][j],i代表是有几位数,而j代表的是从j开头。然后还要知
道其实以j开头的i位数就是以和j不是相邻的数开头的i-1位数的总和。因为只是在前头加了一个j。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define mod 1000000007
int dp[101][101];
int main()
{
int i,j,k,n,m;
long long sum=0;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
dp[1][i]=1;
}
for(i=2;i<=m;i++)//从2开始,最少都是2位数
{
for(j=0;j<n;j++)//从0开始到n-1
{
for(k=0;k<n;k++)
{
if(k!=j-1&&k!=j+1)
{
dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;//i-1位以k开头的都加上去、只要k符合条件
}
}
}
}
for(i=1;i<k;i++)
{
sum=(sum+dp[m][i])%mod;//以i开头的长度为m的个数总和
}
sum=sum%mod;
printf("%lld\n",sum);
return 0;
}