K好数,求大神用正确的动态规划实现,
如果一个自然数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> #include <stdlib.h> static int N1=0; static int N2=1; int jude(int n[],int wei) { int jude2(int n[],int n1,int n2,int wei); if(wei==1) return 0; if(wei==2) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) return 1; } if(wei==3) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) return 1; } if(wei==4) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) return 1; } if(wei==5) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) return 1; } if(wei==6) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) return 1; } if(wei==7) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) return 1; } if(wei==8) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) return 1; } if(wei==9) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) if((n[7]+1!=n[8])&&(n[7]-1!=n[8])) return 1; } if(wei==10) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) if((n[7]+1!=n[8])&&(n[7]-1!=n[8])) if((n[8]+1!=n[9])&&(n[8]-1!=n[9])) return 1; } if(wei==11) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) if((n[7]+1!=n[8])&&(n[7]-1!=n[8])) if((n[8]+1!=n[9])&&(n[8]-1!=n[9])) if((n[9]+1!=n[10])&&(n[9]-1!=n[10])) return 1; } if(wei==12) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) if((n[7]+1!=n[8])&&(n[7]-1!=n[8])) if((n[8]+1!=n[9])&&(n[8]-1!=n[9])) if((n[9]+1!=n[10])&&(n[9]-1!=n[10])) if((n[10]+1!=n[11])&&(n[10]-1!=n[11])) return 1; } if(wei==13) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) if((n[7]+1!=n[8])&&(n[7]-1!=n[8])) if((n[8]+1!=n[9])&&(n[8]-1!=n[9])) if((n[9]+1!=n[10])&&(n[9]-1!=n[10])) if((n[10]+1!=n[11])&&(n[10]-1!=n[11])) if((n[11]+1!=n[12])&&(n[11]-1!=n[12])) return 1; } if(wei==14) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) if((n[7]+1!=n[8])&&(n[7]-1!=n[8])) if((n[8]+1!=n[9])&&(n[8]-1!=n[9])) if((n[9]+1!=n[10])&&(n[9]-1!=n[10])) if((n[10]+1!=n[11])&&(n[10]-1!=n[11])) if((n[11]+1!=n[12])&&(n[11]-1!=n[12])) if((n[12]+1!=n[13])&&(n[12]-1!=n[13])) return 1; } if(wei==15) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) if((n[7]+1!=n[8])&&(n[7]-1!=n[8])) if((n[8]+1!=n[9])&&(n[8]-1!=n[9])) if((n[9]+1!=n[10])&&(n[9]-1!=n[10])) if((n[10]+1!=n[11])&&(n[10]-1!=n[11])) if((n[11]+1!=n[12])&&(n[11]-1!=n[12])) if((n[12]+1!=n[13])&&(n[12]-1!=n[13])) if((n[13]+1!=n[14])&&(n[13]-1!=n[14])) return 1; } if(wei==16) { if((n[0]+1!=n[1])&&(n[0]-1!=n[1])) if((n[1]+1!=n[2])&&(n[1]-1!=n[2])) if((n[2]+1!=n[3])&&(n[2]-1!=n[3])) if((n[3]+1!=n[4])&&(n[3]-1!=n[4])) if((n[4]+1!=n[5])&&(n[4]-1!=n[5])) if((n[5]+1!=n[6])&&(n[5]-1!=n[6])) if((n[6]+1!=n[7])&&(n[6]-1!=n[7])) if((n[7]+1!=n[8])&&(n[7]-1!=n[8])) if((n[8]+1!=n[9])&&(n[8]-1!=n[9])) if((n[9]+1!=n[10])&&(n[9]-1!=n[10])) if((n[10]+1!=n[11])&&(n[10]-1!=n[11])) if((n[11]+1!=n[12])&&(n[11]-1!=n[12])) if((n[12]+1!=n[13])&&(n[12]-1!=n[13])) if((n[13]+1!=n[14])&&(n[13]-1!=n[14])) if((n[14]+1!=n[15])&&(n[14]-1!=n[15])) return 1; } if(wei>=2) { if(jude2(n,N1,N2,wei)==1) return 1; } return 0; } int jude2(int n[],int n1,int n2,int wei) { if((n[n1]+1!=n[n2])&&(n[n1]-1!=n[n2])&&n2<=wei) { jude2(n,N1+=1,N2+=1,wei); return 1; } return 0; } void jinzi(int n[],int k,int ge,int shi) { n[shi]+=1; n[ge]=0; if(n[shi]==k&&shi>0) jinzi(n,k,ge-=1,shi-=1); } int leave(int n[],int n1,int n2,int k,int wei) { if((n[n1]==k-1)&&n[n2]==k-1&&n2<wei) { leave(n,n1+=1,n2+=1,k,wei); return 1; } return 0; } int trans(int k,int wei) { int number=0; if(k<=2) return 0; int N[100]; int f1,f2; N[0]=1; for(f1=1;f1<wei;f1++) { N[f1]=0; } while(1) { N[wei-1]++; if(N[wei-1]==k) jinzi(N,k,wei-1,wei-2); if(jude(N,wei)==1) number++; if(leave(N,0,1,k,wei)==1) break; } return number%1000000007; } int main(int argc, char *argv[]) { int k,l,j; scanf("%d%d",&k,&l); printf("%d",trans(k,l)); scanf("%d",&j); return 0; }率低,在OJ上得10分,
代码如下,求大神出更好的代码,