问题描述
如果一个自然数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%的数据,
K
L
<
=
1
0
6
K^L <= 10^6
KL<=106;
对于50%的数据,K <= 16, L <= 10;
对于100%的数据,1 <= K,L <= 100
分析
分解为三个小问题:
① 将
i
i
i 的K进制表示存入数组,
i
∈
[
K
L
−
1
,
K
L
)
i\in[K^{L-1},K^L)
i∈[KL−1,KL);
② 判断数组中元素是否有 i+1>i (i=0,1,…) 的情况(即判断是否为K好数);
③ 取模输出。
C++代码
//运行超时
//代码长度:652B
//内存使用:2.460MB
//得分:30
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
//将形参 i转换成 k进制下的表示,并存入数组a
void transfer(int i,int k){
do{
a.push_back(i%k);
i/=k;
}while(i>=k);
a.push_back(i);
}
//判断是否有相邻两位是相邻数字
int judge(){
for(int i=0;i<a.size()-1;i++){
if(a[i]-a[i+1]==1||a[i]-a[i+1]==-1) return 0;
}
return 1;
}
int main(){
int N,K,L,count=0;
cin>>K>>L;
for(int i=pow(K,L-1);i<pow(K,L);i++){
transfer(i,K);
if(judge()==1)
count=(count+1)%1000000007;
a.clear();
}
cout<<count;
return 0;
}
Tips
一、尽量避免使用pow这种指数级函数,防止超时