B-number[数位DP]
来源:互联网 发布:warframe防火墙端口 编辑:程序博客网 时间:2024/06/11 12:20
题意: 问一个区间内的数字满足能被13整除,且含有子序列13的数字的个数。
采用数位DP, 记录状态dp[pos][sum][statue]表示当前为pos位,前面求和mod13的值为sum,statue状态下的答案。
其中statue==0表示上一位不是1,statue==1表示上一位是1, statue==2表示前面已经出现过13序列了。
#include<bits/stdc++.h>using namespace std;typedef long long LL;int dig[12];LL dp[15][15][3];// 0- not 1, 1- is 1, 2 - contain 13LL dfs(int pos, int presum, int statue, int limit){ if(pos < 1) return statue==2&&presum%13==0; if(!limit && dp[pos][presum][statue] != -1) return dp[pos][presum][statue]; int n = limit ? dig[pos] : 9; LL res = 0; for(int i = 0; i <= n; ++i) { int nowsum = (presum*10 + i)%13; int nowstatue = statue; if(statue == 0 && i == 1) nowstatue = 1; if(statue == 1 && i != 1) nowstatue = 0; if(statue == 1 && i == 3) nowstatue = 2; res += dfs(pos-1, nowsum, nowstatue, limit&&i==n); } if(!limit) dp[pos][presum][statue] = res; return res;}LL call(LL x){ int len = 0; while(x) { dig[++len] = x%10; x /= 10; } return dfs(len, 0, 0, 1);}int main(){ ios::sync_with_stdio(false); memset(dp, -1, sizeof(dp)); #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif // ONLION_JUDGE LL x; while(cin >> x) { cout << call(x) << endl; } return 0;}
阅读全文
0 0
- B-number[数位DP]
- 【数位dp】B-number
- B-number(数位dp)
- HDU_3652 B-number 数位dp
- 【数位DP】 hdu3652 B-number
- 【hdu3652】【数位DP】B-number
- 【数位DP】B-number HDU3652
- HDU3652:B-number(数位DP)
- hdu3652 B-number (数位DP)
- HDU3652 B-number 数位DP
- hdu3652 B-number 数位dp
- [HDU3652]B-number && 数位DP
- hdu3652 B-number 数位dp
- hdu3652---B-number(数位dp)
- HDU3652 B-number 数位DP
- hdu3652 B-number 数位dp
- hdu3652 B-number 数位dp
- HDU3652 B-number(数位DP)
- XListView+ViewPager
- UVa-11987 Almost union-find(带删除操作的并查集)
- 照片墙
- Elastic-Job 基础篇:基本信息及环境搭建
- 取反的最短路问题(Dijkstra)
- B-number[数位DP]
- 【华为机试】字符串加密
- 有向图强连通分量的Tarjan算法
- csu1976搬运工小明(二分)
- openwrt-mt7688编译与烧录
- SAP中用json数据格式调用http接口发送短信邮件案例
- usb安装ubuntu
- 白书高斯消元模板
- Linux mysql