【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]表 ...
随机推荐
- LeetCode.1051-身高检查器(Height Checker)
这是小川的第390次更新,第420篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第252题(顺位题号是1051).要求学生按身高递增的顺序站列来拍年度照片. 返回没有站在 ...
- 【PyTorch】PyTorch使用LMDB数据库加速文件读取
PyTorch使用LMDB数据库加速文件读取 原始文档:https://www.yuque.com/lart/ugkv9f/hbnym1 对于数据库的了解较少,文章中大部分的介绍主要来自于各种博客和L ...
- 【DSP开发】ccsv6添加simulator功能
ccsv5更新到ccsv6后,ti去掉了simulator功能,具体的说法是"CCSv6 does NOT have any simulators. Texas Instruments is ...
- ElasticSearch 7.3.0 查询、修改、删除 文档操作
PUT chuyuan/_doc/ { "name":"xiaolin", , "sex":"F", "lov ...
- python 并发编程 协程 协程介绍
协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的 需要强调的是: 1. python的线程属于内 ...
- C语言博客作业06
一.表格 问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/988 ...
- nodejs版本控制:nvm use命令失效
Downloading npm version ... Download failed. Rolling Back. Rollback failed. remove C:\Users\Administ ...
- java使用face++简单实现人脸识别注册登录
java使用face++简单实现人脸识别注册登录 前言 人脸识别,好高大上!!! 理解之后很简单. 支付宝使用的就是face++, 至于face++账号信息,apikey…..,本文不做讲述,网上很多 ...
- 数位dp(不要62)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内满足以下条件的数量 1.数位不能出现4,2.任意两相邻数位不能是62. 解法:数位dp[po ...
- Ehcache 入门详解 (转)
一:目录 EhCache 简介 Hello World 示例 Spring 整合 二: 简介 2.1.基本介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hiberna ...