欢迎光临散文网 会员登陆 & 注册

洛谷P4942 小凯的数字 学习笔记

2023-07-18 21:20 作者:景彳亍  | 我要投稿

今天做了一道赏心悦目的数学题:https://www.luogu.com.cn/problem/P4942

用了3种方法,反复学习大佬的思路,优化优化再优化,终于A了。

题目描述:

小凯有一天突发奇想,写下了一串数字:l(l%2B1)(l%2B2)...(r-1)r

例如:l%3D2%2Cr%3D5时,数字为:2345

           l%3D8%2Cr%3D12时数字为:89101112

小凯很喜欢数字 9,所以他想问你他写下的数字除以 9 的余数是多少

例如:l%3D2%2Cr%3D5时,2345%5Cmod9%20%3D5

输入格式:

第一行为数字 Q,表示小凯有 Q 个问题

第 2 到 Q+1 行,每行两个数字 l,r 表示数字范围

输出格式:

对于每行的问题输出一行,一个数字,表示小凯问题的回答


看了半天先把题看错了。我和某罗一直以为是  %5Ctexttt%20%7Bl*(l%2B1)*(l%2B2)...(r-1)*r%7D

打了半天发现样例都没过,才知道是把题看错了。。。

原来是要把这些数字组合成一个大数字,从前往后写就是,然后就没辙了。

思来想去,想到如果一个数是$9$的倍数,那么它的个位数字之和也是9的倍数,既是:


a%20%5Cmod%209%3D(a_1%2Ba_2%2B...%2Ba_n)%20%5Cmod%209


于是有了这样的代码:



就是从l到r枚举,然后拆分数字取模,显然会超时,只有60分。

看着大佬的题解,又有了一个新的思路,我们可以把上式颠倒一下,也能成立。举个例子:


114%20%5Cmod%209%3D6

1%2B1%2B4%3D6%20%5C%20%5C%20%20%5C%20%2C%20%5C%20%5C%206%20%5Cmod%209%3D6


若一个数是由多个数拼成的,那就不需要再把原数二次拆开,直接把原数加起来模$9$就行了。于是有了进阶版:

也超时了。那看来只能用一种能摆脱大循环的方法了。

有了这个式子:

对于每个数p ,显然都有任意整数 n 满足:


%5B(n%2B1)%2B(n%2B2)%2B...%2B(n%2Bp)%5D%20%5Cmod%20p%3D0


这个式子左边可以写成:


n%2Bn%2B...%2Bn%2B1%2B2%2B...%2Bq


其中有p个n,那就可以写成:


%5Clarge%7Bp*n%2B%20%5Cfrac%7B%5Clarge%20p(n%2B1)%7D%7B%5Clarge2%7D%7D


显然,这是p的倍数。

那在这个区间,即l到r中,一定有这个式子所覆盖的数,那这些数我们就可以不用管了。

只需要计算这些数之外的数

到思考的最后一步,我们可以让l和r分别模9,相减计数后输出即可。

结束。


题解参考地址:https://www.luogu.com.cn/blog/ttjb/solution-p4942


洛谷P4942 小凯的数字 学习笔记的评论 (共 条)

分享到微博请遵守国家法律