【NOIP2016提高A组模拟9.24】我的快乐时代
题目
分析
虽然我们很难求出\(\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】我的快乐时代的更多相关文章
- 【NOIP2016提高A组模拟9.24】总结
第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...
- 【NOIP2016提高A组模拟9.24】天使的分裂
题目 分析 这题可以递推, 但是\(O(n)\)还是会超时, 就用矩阵快速幂. #include <cmath> #include <iostream> #include &l ...
- 【JZOJ4799】【NOIP2016提高A组模拟9.24】我的快乐时代
题目描述 输入 一行,两个整数l,r . 输出 一行,一个整数,表示第l 天到第r 天的愉悦值的和. 样例输入 64 89 样例输出 1818 数据范围 解法 可以参考数位动态规划的想法. 从个位开始 ...
- JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数
4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms Memory Limits: 262144 KB Detailed ...
- 【NOIP2016提高A组模拟9.14】数列编辑器
题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...
- 【JZOJ4746】【NOIP2016提高A组模拟9.3】树塔狂想曲
题目描述 相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和.走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1).如下图是一个数塔,映射到该数塔上行 ...
- 【JZOJ4745】【NOIP2016提高A组模拟9.3】看电影
题目描述 听说NOIP2016大家都考得不错,于是CCF奖励省常中了 K 张变形金刚5的电影票奖励OI队的同学去看电影.可是省常中OI队的同学们共有 N(N >= K)人.于是机智的你想到了一个 ...
- 【JZOJ4803】【NOIP2016提高A组模拟9.28】求导
题目描述 输入 输出 样例输入 2x^2+3x+1 样例输出 4x+3 数据范围 样例解释 求导的意思: 多项式是由若干个单项式构成的 单项式的一般形式是ax^b,其中ab都是常数,x是自变量 对于单 ...
- 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子
题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...
随机推荐
- Oracle 笔记(二)
Oracle的sql语言: Sql全称:struct query language 结构化查询语言 五大类: DDL:数据定义语言 create alter drop DQL:数据查询语言sel ...
- 【HANA系列】SAP HANA跟我学HANA系列之创建分析视图一
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA跟我学HANA系 ...
- LeetCode.944-删除列保证排序(Delete Columns to Make Sorted)
这是悦乐书的第362次更新,第389篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第224题(顺位题号是944).我们给出了一个N个小写字母串的数组A,它们的长度都相同. ...
- ELK+Kafka
kafka:接收java程序投递的消息的日志队列 logstash:日志解析,格式化数据为json并输出到es中 elasticsearch:实时搜索搜索引擎,存储数据 kibana:基于es的数据可 ...
- 分布式锁中的基于redis的setnx的原理以及set和setnx的区别是什么
基于Redis实现分布式锁.虽然网上介绍的Redis分布式锁博客比较多,却有着各种各样的问题,本篇博客将详细介绍如何正确地使用setnx实现Redis分布式锁 这里就不介绍错误的示范了 大家直接看正确 ...
- 使用UI Automation实现自动化测试--1-4
Introduction UI Automation是Microsoft .NET 3.0框架下提供的一种用于自动化测试的技术,是在MSAA基础上建立的,MSAA就是Microsoft Active ...
- 常用DOS命令及编程软件fa
1.常用的dos命令(应用) 在接触集成开发环境之前,我们需要使用命令行窗口对Java程序进行编译和运行,所以需要知道dos命令. 打开命令行窗口的方式:win + r打开运行窗口对java程序进行编 ...
- 第六周课程总结&试验报告(四)
一.实验目的 (1)掌握类的继承方法 (2)变量的继承和覆盖,方法的继承,重载和覆盖实现 二.实验内容 三.实验过程 1. 实验源码 package test; import java.util.Sc ...
- 细说vue axios登录请求拦截器
当我们在做接口请求时,比如判断登录超时时候,通常是接口返回一个特定的错误码,那如果我们每个接口都去判断一个耗时耗力,这个时候我们可以用拦截器去进行统一的http请求拦截. 1.安装配置axios cn ...
- gym102201F_Fruit Tree
题意 给一棵带权树,多次询问路径上出现次数超过一半的数. 分析 dfs序建主席树,维护的就是根到某个节点这段路径的值域情况. 因为题目所求的不是一般的众数,而是出现次数大于一半的,所以在主席树上可以直 ...