题目链接

Description

For a positive integer \(n\), let us define \(f(n)\) as the number of digits in base \(10\).

You are given an integer \(S(1≤S≤10^8)\). Count the number of the pairs of positive integers \((l,r)\) \((l≤r)\) such that \(f(l)+f(l+1)+…+f(r)=S\), and find the count modulo \(10^9+7\).

题解

分两种情况讨论。

\(1.\ f(l)\leq 7\)

则至多有\(10^8/8=12500000\)个八位数,所以\(r\leq 22500000\).

因此,可以预处理出\(f[1..22500000]\),然后采用 尺取法 得到 当\(f(l)\leq 7\)时 的\((l,r)\)组数.

\(2. \ f(l)\geq 8\)

此时,由 \(S\) 的限制,易知 \(f(r)-f(l)\leq 1\).

令 \(t=r-l+1\),枚举 \(t\)

若 \(f(l)==f(r)\)

则显然要求 \(t|S\),

记\(N\)位数的个数右 \(D_N\) 个,则符合要求的 \((l,r)\) 组数为 \(D_{\frac{S}{t}}-t+1\)

若 \(f(r)-f(l)==1\)

设 \(len=f(l)\) 且长度为 \(len\) 的数字有 \(x\) 个,长度为 \(len+1\) 的数字有 \(y\) 个,则有

\[\begin{cases}
x+y=t\\
x*len+y*(len+1)=S
\end{cases}
\]

其中\(len=\lfloor\frac{S}{t}\rfloor\).

记\(S=tq+r\ (0\leq r\lt t)\)

则方程组可转化为

\[\begin{cases}
x+y=t\\
xq+y(q+1)=tq+r
\end{cases}
\]

所以有

\[\begin{cases}
x=t-r=t-S\%t\\
y=r=S\%t
\end{cases}
\]

即对每个\(t\)此时有且仅有一组解。

统计上述三部分的答案,即为最终答案。

Code

#include <bits/stdc++.h>
#define lim1 10000000
#define lim2 22500000
using namespace std;
typedef long long LL;
int f[lim2+10];
const LL mod = 1e9+7;
void init() {
int l = 1, r = 10;
for (int k = 1; k <= 7; ++k) {
for (int i = l; i < r; ++i) f[i] = k;
l = r; r *= 10;
}
for (int i = lim1; i <= lim2; ++i) f[i] = 8;
}
LL poww(LL a, LL b) {
LL ret = 1;
while (b) {
if (b & 1) (ret *= a) %= mod;
(a *= a) %= mod;
b >>= 1;
}
return ret;
}
LL count1(LL x) {
int l = 1, r = 1, ret = 0; LL sum = 0;
while (true) {
while (r <= lim2 && sum < x) sum += f[r++];
if (sum < x) break;
if (sum == x) (ret += 1) %= mod;
sum -= f[l++];
if (l == lim1) break;
}
return ret;
}
LL count2(LL x) {
LL upp = x/8,
ret = upp;
for (int t = 1; t <= upp; ++t) {
if (x % t == 0) {
int len = x / t;
LL sub = 9 * poww(10, len-1) % mod;
(sub += mod - t) %= mod;
(ret += sub) %= mod;
}
}
return ret;
}
int main() {
init();
LL n;
scanf("%lld", &n);
LL ans1 = count1(n), ans2 = count2(n);
printf("%lld\n", (ans1+ans2)%mod);
return 0;
}

AtCoder Regular Contest 090 F - Number of Digits的更多相关文章

  1. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  2. AtCoder Regular Contest 090 C D E F

    C - Candies 题意 求左上角走到右下角最大的数字和. 思路 直接\(dp\) Code #include <bits/stdc++.h> #define maxn 110 usi ...

  3. AtCoder Regular Contest 074 F - Lotus Leaves

    题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...

  4. AtCoder Regular Contest 081 F - Flip and Rectangles

    题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...

  5. AtCoder Regular Contest 090

    C - Candies 链接:https://arc090.contest.atcoder.jp/tasks/arc090_a 题意:从左上角走到右下角,只能向右和向下走,问能最多能拿多少糖果. 思路 ...

  6. AtCoder Regular Contest 064 F - Rotated Palindromes

    Problem Statement Takahashi and Aoki are going to together construct a sequence of integers. First, ...

  7. AtCoder Regular Contest 066 F Contest with Drinks Hard

    题意: 你现在有n个题目可以做,第i个题目需要的时间为t[i],你要选择其中的若干题目去做.不妨令choose[i]表示第i个题目做不做.定义cost=∑(i<=n)∑(i<=j<= ...

  8. AtCoder Regular Contest 076 F - Exhausted?

    题意: n个人抢m个凳子,第i个人做的位置必须小于li或大于ri,问最少几个人坐不上. 这是一个二分图最大匹配的问题,hall定理可以用来求二分图最大匹配. 关于hall定理及证明,栋爷博客里有:ht ...

  9. AtCoder Regular Contest 067 F - Yakiniku Restaurants

    题意: 有n个餐厅排成一排,第i个与第i+1个之间距离是Ai. 有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$. 选择每种食物在哪个餐厅里吃,使收益减去走 ...

随机推荐

  1. Linux IO调度方法

    目录 I/O调度的4种算法 I/O调度程序的测试 ionice IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电 ...

  2. centos7.4安装rabbitmq服务(3.7.10版本)

    一.需要安装erlang版本依赖,可以使用二进制安装方式,也可以通过rpm安装,但是安装的时候会提示需要erlang版本>=19.3,而且直接默认yum仓库中的版本较低.,为了节省时间,文章中直 ...

  3. CSS 实现单行、多行文本溢出显示省略号

    单行溢出 width:200px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; -webkit-text-o ...

  4. SourceTree 跳过登录注册,直接使用

    SourceTree下载安装后,运行程序会要求你登录或注册账号才能使用, 然而登录或注册基本都收不到服务器的响应 (在国外嘛,安全起见),于是卡在此处无法使用了. 下面就来介绍一下跳过这尴尬环节的方法 ...

  5. Python中关于集合的介绍及用法

    一.集合的含义及创建方法 集合(set)是一种无序的并且里面存放不同元素的序列. 集合可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因 ...

  6. ACM模板

    #include <iostream> //万能头文件#include<bits/stdc++.h> 方便时用 #include <algorithm> #incl ...

  7. billard:桌球的走位路线图解

    这些是桌球的一些基础知识,记得刚学会桌球那会儿很强烈的想找到类似图片或资料,好久都找不到,最严重的时候只要一闭上眼睛,满脑子就是桌球的路线,线路图几乎是无处不在,痛苦的是经常能理解过来的很多路线因为杆 ...

  8. jq相关细节-1

    animate/动画 所有用于动画的属性必须是数字的,除非另有说明:这些属性如果不是数字的将不能使用基本的jQuery功能.(例如,width, height或者left可以执行动画,但是backgr ...

  9. 继承Thread类使用多线程

    java实现多线程有两种方式,一种是继承Thread类,另外一种就是实现Runnable接口. 两种实现方法的优缺点: 使用Thread类实现多线程局限性就是不支持多继承,因为java是不支持类多继承 ...

  10. loj2092 「ZJOI2016」大森林

    ref不是太懂-- #include <algorithm> #include <iostream> #include <cstring> #include < ...