SP17247
我的方法好像和大家都不一样诶,那我就写个题解吧。
约定:
记
分析:
首先将区间问题转化为前缀和问题,即
也就是说我们只需要能求出任意的
下面考虑如何求
求解:
不难发现,如果我们把
形式化地说,如果令
(好像有点太形式化了)
我们考虑如何求
我们发现,只要预处理求出
代码:
代码中有更明确的计算方式,可能更好理解吧。
#include<bits/stdc++.h>
#define endl '\n'
#define rep(i, s, e) for(int i = s; i <= e; ++i)
#define per(i, s, e) for(int i = s; i >= e; --i)
#define F first
#define S second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128_t i128;
typedef __uint128_t u128;
typedef pair<int, int> pii;
ll pw10[20], g[10], s0[20]; // pw10[i]: 10的i次幂,g[i]: [0,i]或[0,i+1),s0[i]: [0,10^i)
void init() {
pw10[0] = 1;
rep(i, 1, 15) pw10[i] = pw10[i - 1] * 10;
rep(i, 1, 9) g[i] = g[i - 1] + i;
s0[1] = 45;
rep(i, 1, 15) s0[i] = s0[i - 1] * 10 + 45 * pw10[i - 1]; // [0,9]=45
}
ll calc(ll x) {
ll dg[20] = {}, ans = 0, j = 0;
while(x) {
dg[j++] = x % 10;
x /= 10;
}
ll s = 0;
per(i, j, 1) { // 核心部分
s += dg[i];
ans += s * dg[i - 1] * pw10[i - 1];
ans += dg[i - 1] * s0[i - 1];
if(dg[i - 1]) ans += g[dg[i - 1] - 1] * pw10[i - 1];
}
return ans;
}
int main() {
#ifdef ONLINE_JUDGE
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
#endif
init();
int t; cin >> t;
while(t--) {
ll a, b; cin >> a >> b;
cout << calc(b + 1) - calc(a) << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类