标签:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MOD 1000000007 4 int f[210][66],A[210],B[210]; 5 char s1[210],s2[210]; 6 int read() 7 { 8 int s=0,fh=1;char ch=getchar(); 9 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)fh=-1;ch=getchar();} 10 while(ch>=‘0‘&&ch<=‘9‘){s=s*10+(ch-‘0‘);ch=getchar();} 11 return s*fh; 12 } 13 int Dfs(int len,int tot,int flag)//当前到达第len位,差值之和为tot,flag为是否限制(0代表不限制,1代表限制) 14 { 15 if(len==0)return tot>=0; 16 if(tot<-30)return 0;//这两句!!! 17 if(tot>30)tot=30;//这两句!!! 18 if(flag==0&&f[len][tot+30]!=-1)return f[len][tot+30]; 19 int end=flag?B[len]:9,i,ret=0; 20 for(i=0;i<=end;i++)ret=(ret+Dfs(len-1,(tot+A[len]-i)*2,flag&&(i==end)))%MOD; 21 if(flag==0)f[len][tot+30]=ret; 22 return ret; 23 } 24 int main() 25 { 26 int case1=0,T,la,lb,i; 27 T=read(); 28 while(T--) 29 { 30 scanf("\n%s %s",s1+1,s2+1); 31 la=strlen(s1+1); 32 lb=strlen(s2+1); 33 memset(A,0,sizeof(A)); 34 memset(B,0,sizeof(B)); 35 memset(f,-1,sizeof(f)); 36 for(i=1;i<=la;i++)A[i]=s1[la-i+1]-‘0‘;//要从高位枚举,所以要把序列倒过来. 37 for(i=1;i<=lb;i++)B[i]=s2[lb-i+1]-‘0‘;//同上. 38 if(la>lb)swap(la,lb);//取出长度大的. 39 printf("Case #%d: %d\n",++case1,Dfs(lb,0,1)); 40 } 41 fclose(stdin); 42 fclose(stdout); 43 return 0; 44 }
标签:
原文地址:http://www.cnblogs.com/Var123/p/5385146.html