题目

分析

虽然我们很难求出\(\sum_{i=n}^mjoy(i)\),

但是我们可以分别求出\(\sum_{i=1}^mjoy(i)\)和\(\sum_{i=1}^{n-1}joy(i)\),相减就可以了。

如果我们要求\(\sum_{i=1}^xjoy(i)\)

设x的长度为len,

接着枚举i,求出所有i位数的贡献。

分两种情况:

当len>i

接着我们枚举一个位置j,

k为他的相对位置,

再枚举j和k这两个位置分别取什么数,设分别取p和q。

因为这个i位数一定小于x,所以剩下的位置可以随便取(注意j、k重合的情况,以及首位只能取1~9)



每个这样的j、k、p和q,贡献就是\(p*q*方案数\)

当len=i

这部分有点麻烦,因为这个i位数不能大于x

同样枚举一个位置j,k为他的相对位置,再枚举j和k这两个位置分别取什么数,设分别取p和q。

所以,我们打一个数位dp,从首位开始做

设\(f_{l,0或1}\)表示,做完了前l位,这前l位是否与x的前l位相等,是为1,否则为0。

转移很简单,对于l=j、l=k的情况特殊判断。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
const long long mo=1000000007;
const long long N=50005;
using namespace std;
long long n,m,ans,a[N],mi[19],f[20][2];
long long mi1(long long x,long long y)
{
long long sum=1;
while(y)
{
if(y&1) sum=sum*x%mo;
x=x*x%mo;
y/=2;
}
return sum;
}
long long cale(long long x)
{
long long sum=0;
for(long long i=1;x>mi[i] && i<=18;i++)
{
if(x/mi[i+1])
{
for(long long j=1;j<=i;j++)
{
long long k=(i-j+1);
if(j==k)
{
if(i==1)
{
sum=(sum+285)%mo;
}
else
{
sum=(sum+285*9*mi1(10,i-2)%mo)%mo;
}
}
else
if(j==1 || k==1)
{
sum=(sum+45*45*mi1(10,i-2)%mo)%mo;
}
else
{
sum=(sum+45*45*9*mi1(10,i-3)%mo)%mo;
}
}
}
else
{
for(long long j=1;j<=i;j++)
{
long long k=(i-j+1);
if(j!=k)
for(long long p=1;p<=9;p++)
for(long long q=1;q<=9;q++)
{
long long num=p*mi[j]+q*mi[k],value=0;
if(num<=x)
{
memset(f,0,sizeof(f));
if(j==i)
{
if(p==x/mi[i]) f[i][1]=1;
else f[i][0]=1;
}
else
if(k==i)
{
if(q==x/mi[i]) f[i][1]=1;
else f[i][0]=1;
}
else
{
for(int l=1;l*mi[i]<=x;l++) f[i][0]++;
f[i][0]--;
f[i][1]++;
}
for(int l=i-1;l>=1;l--)
{
if(l==j)
{
if(p>(x%mi[l+1])/mi[l])
f[l][0]=(f[l][0]+f[l+1][0])%mo;
else
if(p==(x%mi[l+1])/mi[l])
{
f[l][1]=(f[l][1]+f[l+1][1])%mo;
f[l][0]=(f[l][0]+f[l+1][0])%mo;
}
else
{
f[l][0]=(f[l][0]+f[l+1][0]+f[l+1][1])%mo;
}
}
else
if(l==k)
{
if(q>(x%mi[l+1])/mi[l])
f[l][0]=(f[l][0]+f[l+1][0])%mo;
else
if(q==(x%mi[l+1])/mi[l])
{
f[l][1]=(f[l][1]+f[l+1][1])%mo;
f[l][0]=(f[l][0]+f[l+1][0])%mo;
}
else
{
f[l][0]=(f[l][0]+f[l+1][0]+f[l+1][1])%mo;
}
}
else
for(int l1=0;l1<=9;l1++)
{
if(l1>(x%mi[l+1])/mi[l])
f[l][0]=(f[l][0]+f[l+1][0])%mo;
else
if(l1==(x%mi[l+1])/mi[l])
{
f[l][1]=(f[l][1]+f[l+1][1])%mo;
f[l][0]=(f[l][0]+f[l+1][0])%mo;
}
else
{
f[l][0]=(f[l][0]+f[l+1][0]+f[l+1][1])%mo;
}
}
}
value=(f[1][0]+f[1][1])%mo;
sum=(sum+q*p%mo*value%mo)%mo;
}
}
}
long long j=i/2+1;
if(i%2)
for(int p=1;p<=9;p++)
if(p*mi[j]<=x)
{
memset(f,0,sizeof(f));
if(j==i)
{
if(p==(x%mi[i+1])/mi[i]) f[i][1]=1;
else f[i][0]=1;
}
else
{
for(int l=1;l*mi[i]<=x;l++)
{
f[i][0]++;
}
f[i][0]--;
f[i][1]++;
}
for(int l=i-1;l>=1;l--)
{
if(l==j)
{
if(p>(x%mi[l+1])/mi[l])
f[l][0]=(f[l][0]+f[l+1][0])%mo;
else
if(p==(x%mi[l+1])/mi[l])
{
f[l][1]=(f[l][1]+f[l+1][1])%mo;
f[l][0]=(f[l][0]+f[l+1][0])%mo;
}
else
{
f[l][0]=(f[l][0]+f[l+1][0]+f[l+1][1])%mo;
}
}
else
for(int l1=0;l1<=9;l1++)
{
if(l1>(x%mi[l+1])/mi[l])
f[l][0]=(f[l][0]+f[l+1][0])%mo;
else
if(l1==(x%mi[l+1])/mi[l])
{
f[l][1]=(f[l][1]+f[l+1][1])%mo;
f[l][0]=(f[l][0]+f[l+1][0])%mo;
}
else
{
f[l][0]=(f[l][0]+f[l+1][0]+f[l+1][1])%mo;
}
}
}
sum=(sum+p*p%mo*(f[1][0]+f[1][1])%mo)%mo;
}
}
}
return sum;
}
int main()
{
scanf("%lld%lld",&n,&m);
mi[1]=1;
for(long long i=2;i<=19;i++)
{
mi[i]=mi[i-1]*10;
}
printf("%lld",(cale(m)-cale(n-1)+mo)%mo);
}

【NOIP2016提高A组模拟9.24】我的快乐时代的更多相关文章

  1. 【NOIP2016提高A组模拟9.24】总结

    第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...

  2. 【NOIP2016提高A组模拟9.24】天使的分裂

    题目 分析 这题可以递推, 但是\(O(n)\)还是会超时, 就用矩阵快速幂. #include <cmath> #include <iostream> #include &l ...

  3. 【JZOJ4799】【NOIP2016提高A组模拟9.24】我的快乐时代

    题目描述 输入 一行,两个整数l,r . 输出 一行,一个整数,表示第l 天到第r 天的愉悦值的和. 样例输入 64 89 样例输出 1818 数据范围 解法 可以参考数位动态规划的想法. 从个位开始 ...

  4. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  5. 【NOIP2016提高A组模拟9.14】数列编辑器

    题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...

  6. 【JZOJ4746】【NOIP2016提高A组模拟9.3】树塔狂想曲

    题目描述 相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和.走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1).如下图是一个数塔,映射到该数塔上行 ...

  7. 【JZOJ4745】【NOIP2016提高A组模拟9.3】看电影

    题目描述 听说NOIP2016大家都考得不错,于是CCF奖励省常中了 K 张变形金刚5的电影票奖励OI队的同学去看电影.可是省常中OI队的同学们共有 N(N >= K)人.于是机智的你想到了一个 ...

  8. 【JZOJ4803】【NOIP2016提高A组模拟9.28】求导

    题目描述 输入 输出 样例输入 2x^2+3x+1 样例输出 4x+3 数据范围 样例解释 求导的意思: 多项式是由若干个单项式构成的 单项式的一般形式是ax^b,其中ab都是常数,x是自变量 对于单 ...

  9. 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子

    题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...

随机推荐

  1. 关机报 at-spi-bus-launcher

    查看是否有autostart文件夹,有则不建立 mkdir -v ~/.config/autostart 可直接修改/etc/xdg/autostart/at-spi-dbus-bus.desktop ...

  2. mysql——单表查询——聚合函数——概念

    使用聚合函数查询 group by关键字通常和聚合函数一起使用 .count()函数 count()函数用来统计记录的条数 举例:使用count()函数统计employee表的记录数 select c ...

  3. Centos(64位)安装Hbase详细步骤

    HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...

  4. JMS(Java消息服务)入门教程(一)

    什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...

  5. CSS基本样式-背景属性

    代码是敲出来的,建议一个一个过一遍 背景属性 背景颜色 background-color 背景颜色 默认值是transparent(透明的) 示例代码 <!DOCTYPE html> &l ...

  6. 引入父目录模块 import

    a : a1.py a2.py b : b1.py 其中 a, b 同目录,现在想在b1中引用a1里面内容 在b1中需要进行进行如下操作 x = path.join('..') sys.path.ap ...

  7. AppCan适配问题

    使用AppCan调试中心时,屏幕适配是个问题,经过多次调试总结出如下经验: 1,使用HD+(1560 x 720):显示错乱 2,使用FHD+ (2340 x 1080):显示错乱 3,HD (128 ...

  8. Django查询数据库返回字典dict数据

    个人观点: 个人认为,在Django项目中, 开发团队为了让使用该框架的用户都使用自带的序列化功能,从而让框架中的SQL返回值很不直观,对于直接使用SQL语句的用户很犯难. 解决: from djan ...

  9. PostgreSQL-UNION与Order by 冲突

    问题描述 union 连接的两个sql 都包含 order SELECT <property1>, <property2> FROM <table1> ORDER ...

  10. RabbitMQ入门教程(十五):普通集群和镜像集群

    原文:RabbitMQ入门教程(十五):普通集群和镜像集群 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...