1. 程式人生 > >Investigation LightOJ - 1068

Investigation LightOJ - 1068

light 答案 pri cstring blank col return std 空間

Investigation LightOJ - 1068

常規數位dp題,對於不同k分開記憶化。註意:k大於82(1999999999的數位和)時不會有答案,直接輸出0即可。還有,按照這種記錄不同k時的答案的做法需要卡一下空間。

錯誤1次原因:沒有卡空間

 1 #include<cstdio>
 2 #include<cstring>
 3 int ans[83][11][83][83];
 4 int a,b,k,T,TT;
 5 int w[12];
 6 int dp(int pos,int r,int sum,bool pre0,bool limit)
7 { 8 if(pos<1) return r==0&&sum%k==0&&!pre0; 9 if(!limit&&ans[k][pos][r][sum]!=-1) 10 return ans[k][pos][r][sum]; 11 int i,end=limit?w[pos]:9,res=0; 12 for(i=0;i<=end;i++) 13 res+=dp(pos-1,(r*10+i)%k,sum+i,pre0&&i==0,limit&&i==w[pos]);
14 return limit?res:ans[k][pos][r][sum]=res; 15 } 16 int get(int x) 17 { 18 int g=0; 19 for(;x>0;x/=10) w[++g]=x%10; 20 return dp(g,0,0,1,1); 21 } 22 int main() 23 { 24 memset(ans,-1,sizeof(ans)); 25 scanf("%d",&T); 26 for(TT=1;TT<=T;TT++) 27 { 28 scanf("
%d%d%d",&a,&b,&k); 29 if(k>82) 30 { 31 printf("Case %d: %d\n",TT,0); 32 continue; 33 } 34 printf("Case %d: %d\n",TT,get(b)-get(a-1)); 35 } 36 return 0; 37 }

Investigation LightOJ - 1068