1. 程式人生 > >HDU 6156

HDU 6156

lap size dig 技術 ide style sin class src

數位 當時比賽是時候沒寫出來

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 }
View Code

HDU 6156