hdu6156 数位dp
来源:互联网 发布:js添加属性checked 编辑:程序博客网 时间:2024/06/04 19:23
传送门
求K进制下回文数字个数,用一个数组记录每一位的数字,当跑到比中间位靠右时比较是否和对称位置相同即可,数组开全局,dfs之前进行赋值即可,是回文数字,权值是k否则是1,所以结果要加上1的部分。
#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>using namespace std;int bit[70];__int64 dp[70][70][100][50];int tmp[70];__int64 dfs(int start,int pos,int l,int work,int k){ if(pos == -1) return l ;//已经全部组合完了 if(!work && dp[start][pos][l][k]!=-1)//没有上限,且已经被搜索过了 return dp[start][pos][l][k]; __int64 ans = 0; int end0 = work?bit[pos]:k-1;//有上限就设为上限,否则就设为k-1 for(int i=0; i<=end0; i++) { tmp[pos]=i; if(start==pos&&i==0) ans+=dfs(start-1,pos-1,l,work&&i==end0,k); else if(l==1&&pos<(start+1)/2) ans+=dfs(start,pos-1,tmp[start-pos]==i,work&&i==end0,k); else ans+=dfs(start,pos-1,l,work&&i==end0,k); } if(!work) dp[start][pos][l][k] = ans; return ans;}__int64 solve(__int64 n,int k){ int len = 0; __int64 num=n; while(n) { bit[len++] = n%k; n/=k; } __int64 ans = 0; return dfs(len-1,len-1,1,1,k);}int main(){ int T; __int64 ans; __int64 l,r,R,L; scanf("%d",&T); memset(dp,-1,sizeof(dp)); int TT=1; while(T--) { ans=0; scanf("%I64d%I64d%I64d%I64d",&L,&R,&l,&r); int cnt; for(int i=l;i<=r;i++) { cnt=solve(R,i)-solve(L-1,i); ans+=i*cnt; ans+=(R-L+1)-cnt; } printf("Case #%d: %I64d\n",TT++,ans); } return 0;}
阅读全文
0 0
- hdu6156 数位dp
- hdu6156-(数位dp)
- HDU6156(数位dp)
- HDU6156 Palindrome Function[数位DP]
- hdu6156 Palindrome Function数位dp
- hdu6156 Palindrome Function 数位dp
- 【HDU6156】Palindrome Function(数位DP+回文串)
- hdu6156 Palindrome Function (数位dp)
- hdu6156 Palindrome Function CCPC网赛1007 数位dp
- 数位dp
- 数位DP
- 数位DP
- 数位dp
- 数位dp
- 数位dp
- 数位DP
- 数位dp
- 数位DP
- UVA 1608 Non-boring sequences
- CentOS之——双网卡双IP双网关配置
- python -day05
- Axure--使用阿里云搭建自己的原型发布站点
- JSON和JSONP的区别
- hdu6156 数位dp
- BFS/DFS 模板 代码
- JMX 入门(二)
- 3528:最小新整数
- HDU1251 统计难题【字典树】
- 乐观锁和悲观锁
- 基于FPGA的CORDIC算法实现——Verilog版
- 传递函数依赖
- Codeforces Round #411 D. Minimum number of steps (贪心。)