HDU 6156
Posted HelloWorld!--By-MJY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6156相关的知识,希望对你有一定的参考价值。
数位 当时比赛是时候没写出来
dp[i][j][k][is] 代表 长度为i 开始位子为j k 进制 is是否为回文 ...
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 const int MAXN=1e5+5; 7 const int maxn=1e6+5; 8 typedef long long ll; 9 ll dp[50][50][40][2]; 10 int dig[50]; 11 int tmp[50]; 12 ll dfs(int len,int st,bool is,int jin,bool e) 13 { 14 if(len<0) 15 return is; 16 if(!e&&dp[st][len][jin][is]!=-1) 17 return dp[st][len][jin][is]; 18 ll ans=0; 19 int d=e?dig[len]:jin-1; 20 for(int i=0;i<=d;i++) 21 { 22 tmp[len]=i; 23 if(i==0&&st==len) 24 ans=ans+dfs(len-1,st-1,is,jin,e&&(i==d)); 25 else if(is&&len<(st+1)/2) 26 ans=ans+dfs(len-1,st,is&&(i==tmp[st-len]),jin,e&&(i==d)); 27 else 28 ans=ans+dfs(len-1,st,is,jin,e&&(i==d)); 29 } 30 if(!e) 31 dp[st][len][jin][is]=ans; 32 return ans; 33 } 34 35 ll solve(int a,int jin) 36 { 37 int cnt=0; 38 if(a==0) 39 return 1; 40 while(a) 41 { 42 dig[cnt++]=a%jin; 43 a=a/jin; 44 } 45 return dfs(cnt-1,cnt-1,1,jin,1); 46 } 47 48 49 int main() 50 { 51 int t; 52 scanf("%d",&t); 53 int ca=1; 54 memset(dp,-1,sizeof(dp)); 55 while(t--) 56 { 57 int l1,r1,l2,r2; 58 scanf("%d%d%d%d",&l1,&r1,&l2,&r2); 59 ll ans=0; 60 for(int i=l2;i<=r2;i++) 61 { 62 ll b=solve(r1,i)-solve(l1-1,i); 63 ans=ans+b*i+(r1-l1+1-b); 64 } 65 printf("Case #%d: %lld\n",ca++,ans); 66 } 67 return 0; 68 }
以上是关于HDU 6156的主要内容,如果未能解决你的问题,请参考以下文章