[BZOJ 3326] 数数
Link:
Solution:
明显是一道数位$dp$的题目,就是递推式复杂了点
先要求出一个数$\bar{n}$向添加一位后的$\bar{np}$的转化关系
令$res[\bar{n}]$为数$n$的权值和,
则$res[\bar{np}]=res[\bar{n}]+\sum_{i=1}^{len(n)} \bar{n[i...len(n)]p}$
令$suf[\bar{n}]$为数$n$的后缀和,
则$res[\bar{np}]=res[\bar{n}]+suf[\bar{np}]$
同时$suf$自己的递推式为:$suf[\bar{np}]=base*suf[\bar{n}]+(len(n)+1)*p$
再令$dgt[\bar{n}]$为数$n$的位数,
则$dgt[\bar{np}]=dgt[\bar{n}]+1$
上面的递推式虽然都只针对某一个数$n$,但完全可以逐层推广到之前所有数的和
使原来的$res,suf,dgt$分别表示$\sum res,\sum suf,\sum dgt$,$a$表示数的个数
再用第二维的$0/1$表示是否达到上界,算是数位$dp$的常规套路
剩下的递归式还是看代码吧……
Code:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MAXN=1e5+,MOD=; int B,l1,l2,dat1[MAXN],dat2[MAXN];
ll pre[MAXN],res[MAXN][],a[MAXN][],suf[MAXN][],dgt[MAXN][]; ll solve(int *dat,int l)
{
memset(res,,sizeof(res));memset(dgt,,sizeof(dgt));
memset(a,,sizeof(a));memset(suf,,sizeof(suf)); a[l+][]=;
for(int i=l;i;i--)
{
int cur=(i==l)?:B; a[i][]=a[i+][];
a[i][]=((cur-)+a[i+][]*B+a[i+][]*dat[i])%MOD;
dgt[i][]=(dgt[i+][]+a[i+][])%MOD;
dgt[i][]=((cur-)+(dgt[i+][]+a[i+][])*B%MOD+(dgt[i+][]+a[i+][])*dat[i]%MOD)%MOD;
suf[i][]=(suf[i+][]*B+dgt[i][]*dat[i])%MOD;
suf[i][]=(pre[cur]+(suf[i+][]*B%MOD*B%MOD+(dgt[i+][]+a[i+][])*pre[B]%MOD)+
(suf[i+][]*B*dat[i]%MOD+dgt[i][]*pre[dat[i]]%MOD))%MOD;
res[i][]=(res[i+][]+suf[i][])%MOD;
res[i][]=(res[i+][]*dat[i]%MOD+res[i+][]*B%MOD+suf[i][])%MOD;
}
return (res[][]+res[][])%MOD;
} int main()
{
scanf("%d",&B);
for(int i=;i<=B;i++) pre[i]=(pre[i-]+i-)%MOD; scanf("%d",&l1);
for(int i=l1;i>=;i--) scanf("%d",&dat1[i]);
scanf("%d",&l2);
for(int i=l2;i>=;i--) scanf("%d",&dat2[i]); for(int i=;i<=l1;i++)
if(dat1[i]){dat1[i]--;break;}
else dat1[i]=B-;
if(!dat1[l1]) l1--; printf("%lld",(solve(dat2,l2)-solve(dat1,l1)+MOD)%MOD);
return ;
}
[BZOJ 3326] 数数的更多相关文章
- BZOJ 3326 [SCOI2013]数数 (数位DP)
洛谷传送门 题目: Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制$B$ 确定一个数数的区间$[L, R]$ 对于$[L, R] $间的每一个数, ...
- BZOJ 3326: [Scoi2013]数数
数位DP,然而式子真的复杂 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...
- 【BZOJ 3326】[Scoi2013]数数
题目描述 Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串, ...
- 【BZOJ】【3530】【SDOI2014】数数
AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...
- BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...
- bzoj [Sdoi2014]数数 AC自动机上dp
[Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1264 Solved: 636[Submit][Status][Discu ...
- bzoj 3530: [Sdoi2014]数数 数位dp
题目 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. ...
- 【BZOJ3530】数数(AC自动机,动态规划)
[BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能 ...
- BZOJ3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 322 Solved: 188[Submit][Status] ...
随机推荐
- 【BZOJ】3790 神奇项链
[算法](manacher+贪心)||(manacher+DP+树状数组/线段树) [题解] manacher求回文串,后得到线段,做一点计算映射回原串线段. 然后问题转化为可重叠区间线段覆盖问题,可 ...
- 实现拷贝函数(strcpy)
#include <stdio.h> #include <stdlib.h> // 函数声明 char *mystrcpy(char *object, char *source ...
- 静态资源(JS/CSS)存储在localStorage
一.简单了解SEO SEO由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”.SEO是指从自然搜索结果获得网站流量的技术和过程. 搜索引擎不优化的网站分为 ...
- 项目记录 -- python调用回调函数
C源文件: static int get_callback(zpool_handle_t *zhp, void *data) { zprop_get_cbdata_t *cbp = (zprop_ge ...
- HashMap根据value获取key值
public static String getCityId(HashMap<String,String> citys, String city){ Set set = citys.ent ...
- mysql in/no in/like
% 任意字符 _ 任意一个字符 in (value,......) 在这里 not in (value,......) 不在这里 mysql> select 'a' not in (1,2,3, ...
- aspxpivotgrid排序
protected virtual void SetSortBySummary() { foreach (PivotGridField field in grid.Fields) { if (fiel ...
- 调用微信JS-SDK接口上传图片
最近要在微信上做个问卷调查,有个上传图片功能,折腾找了半天资料,都不好弄,最终打算调用微信提供的上传图片接口,实现上传图片功能!此功能最大的好处是可以在微信服务器上暂存图片,减少本地服务器图片的缓存, ...
- [PAT] 1143 Lowest Common Ancestor(30 分)
1143 Lowest Common Ancestor(30 分)The lowest common ancestor (LCA) of two nodes U and V in a tree is ...
- C语言写随机数
#include <stdio.h> #include <stdlib.h> #include <time.h> ; unsigned int rand0(); v ...