传送门

抄的llj的代码

还有点问题没弄懂,先码着

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=2e5+7,mod=20130427;
typedef long long LL;
typedef double db;
using namespace std;
LL power[N],sum[N],S[N],f[N][2],ans1,ans2,p[N],q[N],a[N],b[N],B,n,m;;template<typename T>void read(T &x)  {char ch=getchar(); x=0; T f=1;while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') f=-1,ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}void jian(LL &n) {if(a[1]) a[1]--;else {a[1]=B-1;For(i,2,n) {a[i]--;if(a[i]>=0) break;a[i]=B-1;}}while(n&&!a[n]) n--;
}void pre(int len) {power[0]=1; sum[0]=1;For(i,1,len) power[i]=power[i-1]*B%mod;For(i,1,len) sum[i]=(sum[i-1]+power[i])%mod;
}void calc(LL s[],int n,LL& ans) {memset(f,0,sizeof(f));p[0]=q[n+1]=0;For(i,1,n) p[i]=(p[i-1]+s[i]*power[i-1]%mod)%mod;Rep(i,n,1) q[i]=(q[i+1]*B%mod+s[i])%mod;For(i,1,n) {LL tp=B*(B-1)/2%mod;f[i][0]=f[i-1][0]*B%mod+tp*sum[i-1]%mod*power[i-1]%mod;tp=s[i]*(s[i]-1)/2%mod;f[i][1]=(tp*sum[i-1]%mod*power[i-1]%mod+s[i]*f[i-1][0]%mod+f[i-1][1]+s[i]*sum[i-1]%mod*(p[i-1]+1)%mod)%mod;ans=(ans+(q[i+1]>1?(q[i+1]-1):0LL)*f[i][0]%mod+f[i][1])%mod;}
} int main() {
#ifdef DEBUGfreopen(".in","r",stdin);freopen(".out","w",stdout);
#endifread(B);read(n); For(i,1,n) read(a[n-i+1]);read(m); For(i,1,m) read(b[m-i+1]); jian(n);pre(200000);calc(a,n,ans1); calc(b,m,ans2); printf("%lld\n",(ans2-ans1+mod)%mod);return 0;
}
/*
55
5 54 12 6 27 14
7 45 11 25 48 7 45 52
*/

View Code

-------------------------------------更新题解---------------------------------------------------

设$f[i][0/1]$表示以从右往左第$i$个数字开头的所有前缀和的和

$0$表示$i$前面没有达到上限,$1$表示$i$以前都达到上限

$power[i]表示B^i,sum[i]为power的前缀和$

$f[i][0]=f[i-1][0]*B+B*(B-1)/2*sum[i-1]$

$f[i][0]=f[i-1][0]*B(这一位B种选法)+B*(B-1)/2(这一位B种选法的和)*sum[i-1](这一位对每个前缀的贡献)$

$q[i]为左数第1到第n-i+1个的上限值,p[i]为右数第1至第i的上限值$

$s[i]为右数第i个数的上限值$

$f[i][0]=s[i]*(s[i]-1)/2*sum[i-1]*power[i-1]+s[i]*f[i-1][0]+f[i-1][1]+s[i]*sum[i-1]*q[i+1]-q[i]$

$f[i][1]=s[i]*(s[i]-1)/2*sum[i-1]*power[i-1]$
这一位取不超过0~s[i]-1,即不超过上限,后面就有power[i-1]种情况,每种这一位的贡献都是作为每个前缀的贡献和。

$+s[i]*f[i-1][0]$
这一位取0~s[i]-1的s[i]中情况下,后面的位对前缀和的贡献是f[i-1][0](未到达上限)

$+f[i-1][1]$
这一位取s[i]这一种情况下,后面的位对前缀和的贡献是f[i-1][1](达到上限)

$+s[i]*sum[i-1]*q[i+1]$
这一位取s[i]这一种情况下,这一位对前缀和的贡献

$-f[i-1][0]$计算f时考虑了前导0,完整的串不能包含前导0,减去前面取0(一种情况),这一位也取0的方案

转载于:https://www.cnblogs.com/Achenchen/p/8666645.html

luoguP3281 [SCOI2013]数数相关推荐

  1. 数数题(计数类 DP)做题记录

    数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...

  2. NOIP模拟测试29「爬山·学数数·七十和十七」

    爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左 ...

  3. 「SDOI2014」数数 解题报告

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

  4. CSDN挑战编程——《金色十月线上编程比赛第一题:小女孩数数》

    金色十月线上编程比赛第一题:小女孩数数 题目详情: [金色十月线上编程比赛规则] 一个小女孩正在用左手手指数数,从1数到n.她从拇指算作1开始数起,然后,食指为2,中指为3,无名指为4,小指为5.接下 ...

  5. 3530: [Sdoi2014]数数

    3530: [Sdoi2014]数数 链接 分析: 对给定的串建立AC自动机,然后数位dp.数位dp的过程中,记录当前在AC自动机的哪个点上,保证不能走到出现了给定串的点. 代码: #include& ...

  6. python画海绵宝宝_《1,2,3到动物园》数数书,适合幼儿园小班宝宝亲子共读,从游戏中了解数字的概念...

    大家好,我是神桐妈妈,最近开始陆续给几个幼儿园做了有关绘本方面的师资培训,然后又有新的幼儿园要有了嵌入式幼儿园绘本馆,有了绘本,有了书香氛围,又有孩子们开始接触绘本,每天拿着一本绘本带回家,和爸爸或者 ...

  7. Linux系统编程:习题,父子进程通过信号通信,实现交替数数

    Linux练习题,父子进程通过信号通信,实现交替数数. 习题思路 父子进程交替发信号进行驱动从而实现数数,值得注意的是 不管是父进程或者子进程谁先发送信号 都会面临一个问题,另外一个进程的信号捕捉函数 ...

  8. javascript 西瓜一期 11 二进制的数数进位解析

    二进制 数数的时候,逢二进一 当需要进位的时候,自己所在的位,变为0,然后左边的数字加1 十进制与二进制的数数

  9. javascript 西瓜一期 10 十进制数数的详细进位解析

    什么是十进制 目前我们使用的数字方面,都是十进制 所谓十进制,就是数数的时候,逢十进一 >细品一下十进制 01 02 03 04 05 06 07 08 09 下一个就是十了,我们逢十要进一位 ...

  10. fafu oj 1266 数数

    http://acm.fafu.edu.cn/problem.php?id=1266 fafu oj 1266 数数 //fafu oj 1266 数数//二分,具体看代码 #include < ...

最新文章

  1. 【ARTS】01_12_左耳听风-20190128~20190203
  2. [转载] Java StringBuilder StringJoiner
  3. Java Core系列之ConcurrentHashMap实现(JDK 1.7)
  4. nyoj-155-求高精度幂(java大数)
  5. mysql之获取自增长的ID
  6. 39. 确保判别式是纯函数
  7. 搭建nfs共享存储服务之三客户端配置
  8. Win10 配置 Python 环境变量
  9. 三通短信每月发送量导入Sqlserver随笔
  10. RJ45网线水晶头的接法
  11. “删库跑路”,这背后的数据安全你悟到了吗?
  12. 手机上日程应该怎么设置提醒
  13. 注册jar包为windows服务
  14. python3 关键词下载必应图片
  15. deepin入坑前必读(懊悔篇)
  16. 2022年电工(中级)考试练习题及答案
  17. python编写程序模拟硬币的投掷、假设0表示硬币的反面_Python.习题四 循环结构
  18. 《管理学原理》题库(4套)
  19. 利用ReliefF算法对特征变量做重要性排序,实现特征选择
  20. linux系统镜像怎么克隆好友,使用SystemImager克隆Linux系统

热门文章

  1. Vector Math for 3D Computer Graphics (Bradley Kjell 著)
  2. 065_VFPage中CallBack回调函数的解释
  3. EOJ 306 树上问题
  4. Git的介绍和常用命令使用
  5. 如何利用vmware workstation安装linux
  6. 手把手玩转win8开发系列课程(9)
  7. exchange 日常管理之八:合并用户邮箱
  8. wpf 切换搜狗输入法英文_搜狗输入法使用技巧整理,建议保存收藏
  9. 计算机科学与技术 双一流,26所双一流高校、18个省市,计算机科学与技术专业分数线汇总!...
  10. 蓝桥杯vip答案java_Java实现 蓝桥杯VIP 算法训练 寂寞的数