【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]表 ...
随机推荐
- 替换RTXLogo插件说明
一.包含Logo图标文件介绍 (一)桌面图标包含在RTX.exe (二)桌面右下角图标包含在MainFrameRes.dll (三)RTX设置图标包含在Config.dll (四)查看用户信息图标包含 ...
- 【神经网络与深度学习】【Python开发】Caffe配置 windows下怎么安装protobuf for python
首先从google上下载protobuf-2.5.0.zip和protoc-2.5.0-win32.zip,然后把protoc-2.5.0-win32.zip里的protoc.exe放到protobu ...
- 关于Docx动态控制word模板文件的数据
博客:https://www.cnblogs.com/24klr/ github: https://github.com/luoruiemail/Dynamic_Word_Web 参考资料:https ...
- 第七周课程总结&实验报告
课程总结 主要学习了抽象类与接口的应用 1.抽象类的成员可以具有访问级别 接口的成员全部public级别 2.抽象类可以包含字段 接口不可以 3.抽象类可以继承接口 接口不能继承抽象类 4.抽象类的成 ...
- 2019JAVA第九次实验报告
Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019.11.8 评分等级 课程总结 1.实验代码 package Domon8; import java.awt. ...
- 100+ Python挑战性编程练习(1)
目前,这个项目已经获得了7.1k Stars,4.1k Forks. 初级水平是指刚刚通过Python入门课程的人.他可以用1或2个Python类或函数来解决一些问题.通常,答案可以直接在教科书中找 ...
- TIDB学习资料
TiDB 源码阅读系列文章(一)序 TiDB 源码阅读系列文章(二)初识 TiDB 源码 TiDB 源码阅读系列文章(三)SQL 的一生 TiDB 源码阅读系列文章(四)Insert 语句概览 TiD ...
- Hive Error : Java heap space 解决方案
Java heap space问题一般解决方案: 设置 set io.sort.mb=10; 排序所使用的内存数量,默认值是100M,和mapred.child.java.opts相对应,opts默认 ...
- linux 内核数据结构之红黑树.
转载: http://www.cnblogs.com/haippy/archive/2012/09/02/2668099.html https://zh.wikipedia.org/zh/%E7%BA ...
- WTF!! Vue数组splice方法无法正常工作
当函数执行到this.agents.splice()时,我设置了断点.发现传参index是0,但是页面上的列表项对应的第一行数据没有被删除, WTF!!! 这是什么鬼!然后我打开Vue Devtool ...