2019.03.28 bzoj3326: [Scoi2013]数数(数位dp)
传送门
题意:
一个人数数,规则如下:
- 确定数数的进制B
- 确定一个数数的区间[L, R]
- 对于[L, R] 间的每一个数,把该数视为一个字符串,列出该字符串的所有连续子串对应的B进制数的值。
- 对所有列出的数求和。
结果用10 进制表示,对20130427取模。
思路:
我不知道为什么要从低位开始向高位处理2333333手动毒瘤
然后肝了好久幸好没有推错不然就自闭了
不过需要多预处理一点东西。
假设现在计算[1,a][1,a][1,a]的答案,aaa一个表示BBB进制数的数组
ssi:ss_i:ssi:所有不含前导000的iii位数的子串之和。
s1i:s_{1i}:s1i:所有包含前导000的iii位数的子串之和。
s2i:s_{2i}:s2i:所有包含前导000的iii位数的前缀串之和。
pwi:pw_i:pwi:BBB的iii次方。
spwi:spw_i:spwi:pwpwpw的前缀和。
预处理出上面的信息就可以递推了(注意我是从后往前推的所以很复杂):
设现在在第iii位,我们记fff表示iii~nnn满足aaa数组限制的所有n−i+1n-i+1n−i+1位数的子串之和,pfpfpf表示i+1i+1i+1位推出的fff;
ggg表示满足aaa数组限制的所有n−i+1n-i+1n−i+1位数的个数,pgpgpg表示i+1i+1i+1位推出的ggg;
sss表示满足aaa数组限制的所有n−i+1n-i+1n−i+1位数的前缀串之和,pspsps表示i+1i+1i+1位推出的sss。
然后就可以分第iii位填000,填111~ai−1a_i-1ai−1,aia_iai的情况大力转移了,注意特判ai=0a_i=0ai=0的情况。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
typedef long long ll;
const int N=1e5+5,mod=20130427;
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int mul(const int&a,const int&b){return (ll)a*b%mod;}
inline void update(int&a,const int&b){a=a+b>=mod?a+b-mod:a+b;}
int B,n,ans=0,a[N],pw[N],spw[N],s1[N],s2[N],ss[N];
inline int calc(int x){return (ll)(x+1)*x/2%mod;}
inline void init(){
pw[0]=spw[0]=1;
for(ri i=1;i<=n;++i)pw[i]=mul(pw[i-1],B),spw[i]=add(pw[i],spw[i-1]);
s1[0]=s2[0]=ss[0]=0;
for(ri i=1,tmp=calc(B-1);i<=n;++i)s2[i]=add(mul(tmp,mul(pw[i-1],spw[i-1])),mul(s2[i-1],B));
for(ri i=1,tmp=calc(B-1);i<=n;++i)s1[i]=add(mul(tmp,mul(pw[i-1],spw[i-1])),mul(B,add(s2[i-1],s1[i-1])));
for(ri i=1;i<=n;++i)ss[i]=add(mul(add(s1[i-1],s2[i-1]),B-1),mul(calc(B-1),mul(pw[i-1],spw[i-1]))),update(ss[i],ss[i-1]);
update(ans,ss[n-1]);
}
inline void solve(){
n=read();
for(ri i=1;i<=n;++i)a[i]=read();
init();
for(ri tmp,ps=0,pf=0,pg=1,s,f,g,i=n;i;--i,pf=f,pg=g,ps=s){
if(!a[i]){f=add(pf,ps),g=pg,s=ps;continue;}
f=s=0,g=1;
tmp=mul(a[i]-1,add(s1[n-i],s2[n-i]));
update(tmp,mul(mul(calc(a[i]-1),spw[n-i]),pw[n-i]));
update(f,tmp);
if(i==1)update(ans,tmp);
g=mul(g,mul(pw[n-i],a[i]-1));
update(s,mul(mul(calc(a[i]-1),pw[n-i]),spw[n-i]));
update(s,mul(s2[n-i],a[i]-1));
update(f,add(s1[n-i],s2[n-i]));
update(g,pw[n-i]);
update(s,s2[n-i]);
tmp=mul(mul(a[i],pg),spw[n-i]);
update(tmp,pf),update(tmp,ps);
update(f,tmp);
if(i==1)update(ans,tmp);
update(g,pg),update(s,mul(mul(pg,a[i]),spw[n-i])),update(s,ps);
}
}
inline void Solve(){for(ri i=1,sum=0;i<=n;++i)ans=add(ans,sum=add(mul(sum,B),mul(a[i],i)));}
int main(){
B=read();
solve();
ans=mod-ans;
Solve();
solve();
cout<<ans;
return 0;
}
2019.03.28 bzoj3326: [Scoi2013]数数(数位dp)的更多相关文章
- 2019.03.28 bzoj3322: [Scoi2013]摩托车交易(kruskal重构树+贪心)
传送门 题意咕咕咕 思路: 先把所有可以列车通的缩成一个点,然后用新图建立kruskalkruskalkruskal重构树. 这样就可以倒着贪心模拟了. 代码: #include<bits/st ...
- 2019.03.28 bzoj3325: [Scoi2013]密码(manacher+模拟)
传送门 题意: 现在有一个nnn个小写字母组成的字符串sss. 然后给你nnn个数aia_iai,aia_iai表示以sis_isi为中心的最长回文串串长. 再给你n−1n-1n−1个数bib_ ...
- BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP
BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...
- BZOJ_1026_[SCOI2009]windy数_数位DP
BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...
- [bzoj 1026]windy数(数位DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 分析: 简单的数位DP啦 f[i][j]表示数字有i位,最高位的数值为j的windy数总 ...
- bzoj 1026 [SCOI2009]windy数(数位DP)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4550 Solved: 2039[Submit][Sta ...
- [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】
题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...
- BZOJ 3209 花神的数论题 数位DP+数论
题目大意:令Sum(i)为i在二进制下1的个数 求∏(1<=i<=n)Sum(i) 一道非常easy的数位DP 首先我们打表打出组合数 然后利用数位DP统计出二进制下1的个数为x的数的数量 ...
- BZOJ 3209: 花神的数论题 [数位DP]
3209: 花神的数论题 题意:求\(1到n\le 10^{15}\)二进制1的个数的乘积,取模1e7+7 二进制最多50位,我们统计每种1的个数的数的个数,快速幂再乘起来就行了 裸数位DP..\(f ...
随机推荐
- Autowried注解和Resource注解的区别
目录 1.概述 2.Autowried 3.Resource 4.总结 1.概述 在使用Spring框架的过程中, 依赖注入是必须的, 大多时候会使用Autowried注解来进行依赖注入, 但是也可以 ...
- renameTo()判断文件是否被占用(判断大文件是否完成拷贝这个动作)
在开发需求中有一个需求是监控目录下拷贝进来的文件,并对文件进行处理, 使用的java.nio . watchService 进行的处理,如果小文件还好一点,拷贝就是一瞬间的事情,但是如果是一个大文件 ...
- 从servlet规范说起
servlet规范 1 servlet 3.1规范 1.1 What is servlet A servlet is a JavaTM technology-based Web component, ...
- CSS 背景图像 背景图片定位
背景图片定位 background-position属性可以给背景图片定位. background-position属性有两个值,第一个值是水平位置,第二个值是垂直位置.这两个值可以使用百分比来表示( ...
- 云主机中毒 cpu爆满解决日志
在上一篇博文Linux系统发现占用CPU达100%的进程并处理 里面以为已经把挖矿程序sustse处理干净了,可是没过两天又收到阿里云短信提醒,说服务器有问题,难道还有后门吗?也多亏阿里云给出提示“出 ...
- Apache Flink 数据流编程模型
抽象等级(Levels of Abstraction) Flink提供不同级别的抽象来开发流/批处理应用程序. Statefule Stream Processing: 是最低级别(底层)的抽象,只提 ...
- 基于SDL2实现俄罗斯方块
俄罗斯方块有多种旋转规则,我这里采用的是SRS.如果要改变旋转规则的话也很方便. SRS: 内容后续补充.. 代码:https://github.com/CknightX/sdl_Tetris 素材来 ...
- MySQL如何解决1209错误
1209 - The MySQL server is running with the--read-only option so it cannot execute this sta ...
- ambiguous
ambiguous - 必应词典 美[æm'bɪɡjuəs]英[æm'bɪɡjuəs] adj.模棱两可的:含混不清的:多义的:不明确的 网络含糊的:模糊的:暧昧的 搭配ambiguous answe ...
- Java中的属性和方法
题目 实体类 测试类