标签:个数 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。
对于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里的结构体(?)忘了打{} 二维数组定义过小也有溢出
还是要明白思想
标签:个数 div 动态 scan 算法 位置 ext 循环 次数
原文地址:https://www.cnblogs.com/shawu/p/12308296.html