题面

解析

神仙LZF随机找出的毒瘤题.

一开始读题过于草率导致\(naive\)了.

step 1

看上去特别像数位DP(实际上也有一点).

先预处理出有\(i\)位的数(最高位不为\(0\))的数的变换值的和\(f[i]\),

它可以通过一段数前后各拼上一个数得到(也就是通过\(f[i-2]\)转化).

再设\(g[i]\)表示最高位可以为\(0\)的和,

那么\(f[i]=(g[i-2]*90+90*45*jc[i-2])\),

$g[i]=g[i-2]100+9045*jc[i-2] $,

(其中\(jc[i]\)代表\(10^i\)不要问为什么叫这个名字)

这里解释一下,

首先中间的一段在前后的0~9每个数字都加了一次,

所以一共加了100次,但由于\(f\)的最高位不为0所以是90次.

然后当前后的数字固定后中间的每个排列都要算上所以要乘上\(10^i\),

最后前后两端的数的和就是\(\sum_{i=0}^{9}\sum_{j=0}^{9}i*j+j*i\),

也就是\(45*45*2\).

step 2

我们可以把题目转化为求\(\sum_{i=1}^{i=r}f[i]-\sum_{i=1}^{i=l-1}f[i],\)

用前缀和的方式把问题分成两个相同的部分.

我们设那一整块为\(find(x)\),

设\(x\)有\(l\)位,

那前面的\(l-1\)位的数就直接预处理出来了:\(\sum_{i=1}^{l-1}f[i]\).

关键就在于处理\(l\)位的数.

这里我们拿\(56789\)举个例子,

预处理的话就到了\(9999\),

然后枚举每一位的数,

设第\(i\)位的数为\(a[i]\)(从低位到高位依次为1~\(l\)).

那么从0(最高位是1)到\(a[i]-1\)时,后面的数都可以随便取,

在例子里面就分别可以到\(49999,5999,699,89,8\).

然后我们就发现再加上它本身就把所有情况找齐了!

于是我们对每一位进行统计就行了.

step 3

现在我们来考虑怎么统计.

假设我们现在在统计第\(p\)位,

枚举每一位\(j\),以及它对应的\(k=l-j+1\).

那么对于\(j(k)\),它们有三种情况:大于\(p\),等于\(p\),小于\(p\).

当大于\(p\)时,它能贡献的就只有它那位上的数字,

其它的要么不能贡献要么在前面已经统计过了.

但是它贡献了0~\(a[p]-1\)次.

当等于\(p\)时,它就贡献了1~\(a[p]-1\)每个一次.

当小于\(p\)时,它就可以取0~9.

**注意,因为\(p\)后面的数可以随便取,所以还要在每次计算后面乘上\(10^t\),\(t\)取决于\(j,k\)的位置.

大概就这么多了...(具体的分类写在代码里了).

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std; inline ll read(){
ll sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} const int N=101;
const int Mod=1000000007;
ll l,r;
ll f[N],g[N],a[N],jc[N]; inline ll find(ll x){
int len=0;ll ret=0;
for(;x;x/=10) a[++len]=x%10;
for(int i=1;i<len;i++) ret=(ret+f[i])%Mod;
for(int p=len;p;p--){
int nm=p-1,st=p==len? 1:0;//最高位不能为0
int tmp=0,tem=0,tt=a[p]-st;
for(int i=st;i<a[p];i++) tem+=i,tmp+=i*i;
//这里说一下因为长度可能为单数,所以有自己乘自己的情况,所以有tmp
for(int j=len;j;j--){
int k=len-j+1;
if(j>p){
if(k>p) ret=(ret+a[j]*a[k]*jc[nm]*tt)%Mod;//都大于p贡献了a[p]-st次
else if(k==p) ret=(ret+a[j]*tem*jc[nm])%Mod;//等于p贡献了st~a[p]每个一次
else ret=(ret+a[j]*45*jc[nm-1]*tt)%Mod;//因为k已经随便取了所以只有nm-1个数了
}
else if(j==p){
if(k>p) ret=(ret+tem*a[k]*jc[nm])%Mod;
else if(k==p) ret=(ret+tmp*jc[nm])%Mod;
else ret=(ret+tem*45*jc[nm-1])%Mod;
}
else{
if(k>p) ret=(ret+a[k]*45*jc[nm-1]*tt)%Mod;
else if(k==p) ret=(ret+45*tem*jc[nm-1])%Mod;
else{
if(k==j) ret=(ret+285*jc[nm-1]*tt)%Mod;//自己乘自己
else ret=(ret+45*45*jc[nm-2]*tt)%Mod;
}
}
}
}
for(int i=1;i<=len;i++) ret=(ret+a[i]*a[len-i+1])%Mod;
return ret;
} signed main(){
l=read();r=read();
f[1]=g[1]=285;jc[0]=1;
for(int i=1;i<=19;i++) jc[i]=jc[i-1]*10%Mod;
for(int i=2;i<=19;i++){
f[i]=(g[i-2]*90%Mod+90*45*jc[i-2]%Mod)%Mod;
g[i]=(g[i-2]*100%Mod+90*45*jc[i-2]%Mod)%Mod;
}
printf("%lld\n",(find(r)-find(l-1)+Mod)%Mod);
return 0;
}

题解 [51nod1607] 卷积和的更多相关文章

  1. 浅谈卷积和C++实现

    1 信号处理中的卷积 无论是信号处理.图像处理还是其他一些领域,我们经常会在一些相互关联的数据处理中使用卷积.卷积可以说是算法中一个非常重要的概念.这个概念最早起源于信号处理之中. 假设对于一个线性系 ...

  2. (2)卷积 & 卷积和

    参考资料:<信号与系统(第二版)> 杨晓非 何丰 连续信号的是卷积积分,离散信号的是卷积和. 脉冲分量 任意非周期信号,将横坐标分为若干个微小等分,得到Δτ为宽,f(kΔτ)为高的一系列微 ...

  3. 2020级cpp上机考试题解#B卷

    A卷的第七题我只会一个个排除的方法 意思就是暂时没有好办法所以A卷不搞了 1:递归函数求数列 题意: 有一个递归函数int f(int m),计算结果代表了数列的第m项.当m等于1时,函数结果返回1: ...

  4. 『高性能模型』深度可分离卷积和MobileNet_v1

    论文原址:MobileNets v1 TensorFlow实现:mobilenet_v1.py TensorFlow预训练模型:mobilenet_v1.md 一.深度可分离卷积 标准的卷积过程可以看 ...

  5. 车载多传感器融合定位方案:GPS +IMU+MM

    导读 高德定位业务包括云上定位和端上定位两大模块.其中,云上定位主要解决Wifi指纹库.AGPS定位.轨迹挖掘和聚类等问题:端上定位解决手机端和车机端的实时定位问题.近年来,随着定位业务的发展,用户对 ...

  6. 如何理解 卷积 和pooling

    转自:http://blog.csdn.net/malefactor/article/details/51078135 CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见的深度学习模型.图1展示了 ...

  7. [Keras] mnist with cnn

    典型的卷积神经网络. Keras傻瓜式读取数据:自动下载,自动解压,自动加载. # X_train: array([[[[ 0., 0., 0., ..., 0., 0., 0.], [ 0., 0. ...

  8. 论文阅读(Zhuoyao Zhong——【aixiv2016】DeepText A Unified Framework for Text Proposal Generation and Text Detection in Natural Images)

    Zhuoyao Zhong--[aixiv2016]DeepText A Unified Framework for Text Proposal Generation and Text Detecti ...

  9. OpenCV 之 图像平滑

    1  图像平滑 图像平滑,可用来对图像进行去噪 (noise reduction) 或 模糊化处理 (blurring),实际上图像平滑仍然属于图像空间滤波的一种 (低通滤波) 既然是滤波,则图像中任 ...

随机推荐

  1. [转帖]海思大佬称华为CPU同频追平AMD 注水吹嘘玩文字游戏?

    海思大佬称华为CPU同频追平AMD 注水吹嘘玩文字游戏? https://t.cj.sina.com.cn/articles/view/6635931736/18b88485800100cz4h?fr ...

  2. Vue(一)环境搭建、创建项目

    1.安装node和npm 因为node已经有npm,所以直接安装node,配置环境变量 官网地址:http://nodejs.cn/download/ 2.查看node是否安装成功,输入名nde -v ...

  3. Linux Crontab格式说明

    Crontab基本格式: * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4 ...

  4. Block Breaker HDU - 6699(深搜,水,写下涨涨记性)

    Problem Description Given a rectangle frame of size n×m. Initially, the frame is strewn with n×m squ ...

  5. 剑指offer23:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。输出Yes OR No。

    1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 2 思路和方法 二叉搜索树:二叉查找树(Bin ...

  6. php分页思路

    <?php class page{ public $nowPage=1; public $perPage=10; public $showPage=10; public $totalPage; ...

  7. 2.安装阿里yum源

    1.删除自带的yum源:#cd /etc/yum.repos.d/#rm -rf *   2.配置远程yum源:wget -O /etc/yum.repos.d/CentOS-Base.repo ht ...

  8. 前端工程师应该知道的yarn知识

    yarn 是在工作中离不开的工具,但在工作中,很多人基本只会使用 yarn install,而且会手动删除 node-modules,或删除 yarn.lock 文件等不规范操作.本文将从一些基础的知 ...

  9. python经典小程序集锦(一) 实现九九乘法表

    本篇文章主要是收集整理一些小程序以供大家娱乐,或者是在面试的时候使用到.文章会持续更新,希望大家收藏关注哦. 1.代码实现过程 for i in range(1, 10): for j in rang ...

  10. instanceof关键字 与 getClass()

    在equals()中使用getClass进行类型判断 我们在覆写equals()方法时,一般都是推荐使用getClass来进行类型判断,不是使用instanceof.我们都清楚instanceof的作 ...