Link:

BZOJ 3326 传送门

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] 数数的更多相关文章

  1. BZOJ 3326 [SCOI2013]数数 (数位DP)

    洛谷传送门 题目: Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制$B$ 确定一个数数的区间$[L, R]$ 对于$[L, R] $间的每一个数, ...

  2. BZOJ 3326: [Scoi2013]数数

    数位DP,然而式子真的复杂 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...

  3. 【BZOJ 3326】[Scoi2013]数数

    题目描述 Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串, ...

  4. 【BZOJ】【3530】【SDOI2014】数数

    AC自动机/数位DP orz zyf 好题啊= =同时加深了我对AC自动机(这个应该可以叫Trie图了吧……出边补全!)和数位DP的理解……不过不能自己写出来还真是弱…… /************* ...

  5. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  6. bzoj [Sdoi2014]数数 AC自动机上dp

    [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1264  Solved: 636[Submit][Status][Discu ...

  7. bzoj 3530: [Sdoi2014]数数 数位dp

    题目 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. ...

  8. 【BZOJ3530】数数(AC自动机,动态规划)

    [BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能 ...

  9. BZOJ3530: [Sdoi2014]数数

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 322  Solved: 188[Submit][Status] ...

随机推荐

  1. performSelector支持多参数

    默认的performSelector支持最多传递两个参数,要想传递超过两个的参数,需要使用NSInvocation来模拟performSelector的行为,如下: - (id)performSele ...

  2. python学习笔记(二)之python简单实践

    1 安装python开发环境 Linux环境下自动安装好了python,可以通过以下命令更新到python最新版本. #echo "alias python=/usr/bin/python3 ...

  3. 【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈)

    题目链接 把线段以斜率为第一关键字,截距为第二关键字升序排序. 然后维护一个单调栈,保证栈中两两线段的交点的\(x\)坐标单调上升就行了.栈中的线段即为所求. #include <cstdio& ...

  4. POj 2104 K-th Number (分桶法+线段树)

    题目链接 Description You are working for Macrohard company in data structures department. After failing ...

  5. HDU 2059 龟兔赛跑 (dp)

    题目链接 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击--赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成 ...

  6. hdu 1869 六度分离(最短路floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 六度分离 Time Limit: 5000/1000 MS (Java/Others)    M ...

  7. highcharts 从后台动态改变数据

    //columnChart    图表对象,创建示例就展示了. var series = this.columnChart.series;                            whi ...

  8. vue-实现倒计时功能

    JavaScript 创建一个 countdown 方法,用于计算并在控制台打印距目标时间的日.时.分.秒数,每隔一秒递归执行一次. msec 是当前时间距目标时间的毫秒数,由时间戳相减得到,我们将以 ...

  9. Vue组件-组件的注册

    注册组件 全局组件 注册组件就是利用Vue.component()方法,先传入一个自定义组件的名字,然后传入这个组件的配置. Vue.component('my-component', { templ ...

  10. mysql 1366的错误 字符集错误解决方案

    最近用mysqlalchmy的时候遇到了 sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1366, "Incorrec ...