码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 6156

时间:2017-08-21 21:08:51      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:lld   splay   bsp   hid   opened   dig   memset   for   printf   

数位  当时比赛是时候没写出来 

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

标签:lld   splay   bsp   hid   opened   dig   memset   for   printf   

原文地址:http://www.cnblogs.com/cherryMJY/p/7406596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!