标签:
B-number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3434 Accepted Submission(s): 1921
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 using namespace std; 7 8 int f[16][2][16][16]; 9 10 int count(int x,int y) 11 { 12 for(int i=1;i<x;i++) 13 y=y*10%13; 14 return y; 15 } 16 17 void DP() 18 { 19 for(int i=0;i<=9;i++) 20 f[1][0][i][i]=1; 21 for(int i=2;i<=10;i++) 22 for(int j=0;j<=9;j++) 23 { 24 int mod=count(i,j); 25 for(int kk=0;kk<=9;kk++) 26 for(int ll=0;ll<13;ll++) 27 { 28 if(j==1 && kk==3)f[i][1][j][ll]+=f[i-1][0][kk][(ll-mod+13)%13]; 29 else f[i][0][j][ll]+=f[i-1][0][kk][(ll-mod+13)%13]; 30 f[i][1][j][ll]+=f[i-1][1][kk][(ll-mod+13)%13]; 31 } 32 } 33 } 34 35 int get(int x) 36 { 37 int num[12],len=0,res=0; 38 while(x) 39 { 40 num[++len]=x%10; 41 x/=10; 42 } 43 for(int i=1;i<num[len];i++) 44 res+=f[len][1][i][0]; 45 for(int i=1;i<=len-1;i++) 46 for(int j=1;j<=9;j++) 47 res+=f[i][1][j][0]; 48 int mod=count(len,num[len]),flag=0; 49 for(int i=len-1;i>=1;i--) 50 { 51 for(int j=0;j<num[i];j++) 52 { 53 res+=f[i][1][j][(13-mod)%13]; 54 if(flag || (j==3 && num[i+1]==1) )res+=f[i][0][j][(13-mod)%13]; 55 } 56 if(num[i]==3&&num[i+1]==1)flag=1; 57 mod=(mod+count(i,num[i]))%13; 58 } 59 return res; 60 } 61 62 int main() 63 { 64 int r; 65 DP(); 66 while(~scanf("%d",&r)) 67 printf("%d\n",get(r+1)); 68 return 0; 69 }
标签:
原文地址:http://www.cnblogs.com/tuigou/p/4832721.html