蓝桥杯麦森数c语言,算法训练 K好数

对于30%的数据,KL <= 106;

对于50%的数据,K <= 16, L <= 10;

对于100%的数据,1 <= K,L <= 100。

思路:

因为知道数位DP,考虑用DP解法。刚开始看到进制蒙圈了,因为一般都是给定区间,然后对数的每一位分解状态的。

然后假定进制确定之后再进行初始化的话,就是简单的数位DP了,思路一下明白。

确定进制之后,每一位的取值最大只能到K-1。

初始化的时候注意,不管什么进制,不论首位是几,只要是1位数,一定符合K好数。因为K好数是对两位以上说明的。

最后累加求和的话,位数是确定的L。所以累计dp[L][...]。首位的取值不能是0,因为如果是0,除去前导0,就变成L-1位了。

代码:

#include

#include

#include

#include

#include

using namespace std;

int dp[101][101];//到100

const int mod=1000000007;

int main()

{

int K,L;

scanf("%d%d",&K,&L);

memset(dp,0,sizeof(dp));

for(int j=0;j<=K-1;j++)

{

dp[1][j]=1;//不管首位取什么值,只要是1位数,肯定是符合K好数的要求,置为1

}

for(int i=2;i<=L;i++)//最少为2位数

{

for(int j=0;j<=K-1;j++)//模拟第i位取值

{

for(int k=0;k<=K-1;k++)//模拟第i-1位取值

{

if(!(fabs(j-k)==1))//相邻两数差值不为1,即为符合条件

{

dp[i][j]=(dp[i][j]%mod+dp[i-1][k]%mod)%mod;

}

}

}

}

int sum=0;

for(int j=1;j<=K-1;j++)//不考虑进制,要求长度为L,首位取值任意(除0外)

{

sum=(sum%mod+dp[L][j]%mod)%mod;

}

printf("%d\n",sum);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值