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 }

时间: 2024-08-01 22:41:57

HDU 6156的相关文章

hdu 6156 Palindrome Function(回文数位dp)

题目链接:hdu 6156 Palindrome Function 题意: 给你一个L,R,l,r,问你在[L,R]内在[l,r]进制下有多少数是回文数,然后算一算贡献. 题解: 由于答案和该回文数的最高位有关(因为前导0不算). 考虑dp[i][j][k],表示在i进制下,当前考虑到第j位,该数字的起始点在第k位. 然后开一个数组记录一下前面的数字,做一下记忆化搜索就行了. 1 #include<bits/stdc++.h> 2 #define mst(a,b) memset(a,b,siz

HDU 6156 Palindrome Function 数位DP

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f(x) = 1 其他情况 解题思路: 数位DP, 统计个数 , 需要作出改变的就是进制和回文 代码: #include <iostream> #include <cstdio> #include <string> #include <vector> #inclu

【数位DP】HDU 6156 Palindrome Function

http://acm.hdu.edu.cn/showproblem.php?pid=6156 [AC] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod=1e9+7; 5 int num[50]; 6 int L,R,l,r; 7 ll query(int x,int k) 8 { 9 if(x==0) return 0; 10 int cnt=0; 11 int cp

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做一个数位DP就好了.dp[jz][start][cur][state]表示jz进制下以start位起始到cur位状态为state(1表示已经回文,0表示没有回文)时回文数的个数. #include <bits/stdc++.h> using namespace std; typedef long

hdu 6156 Palindrome Function

数据好像极限,按理来说二分是可以过得,就是被卡主 #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<cmath> #include<set> #

HDU 6156 回文 数位DP(2017CCPC)

Palindrome Function Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total Submission(s): 559    Accepted Submission(s): 299 Problem Description As we all know,a palindrome number is the number which reads the same

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往