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

 

以上是关于HDU 6156的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6156

hdu 6156 Palindrome Function

HDU 6156 回文 数位DP(2017CCPC)

HDU6156 Palindrome Function

HDU-6156题解(数位DP)

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP