[题解]AT_abc288_f [ABC288F] Integer Division

思路

定义 dpi 表示前 i 位所能得到的答案。

那么,不难得出状态转移方程,其中 Xi,j 表示 Xi,j 转为的数字:

dpi=j=1i1(dpj×Xj+1i)+X1,i

这样的时间复杂度为 Θ(n2) 过不了,考虑用前缀和优化。

dpi=j=1i1(dpj×Xj+1,i)+X1,i=j=1i1(dpj×(10×Xj+1,i1+Xi,i))+X1,i=10×dpi1+Xi,i×j=1i1(dpj)+X1,i

然后用前缀和维护一下 j=1i1(dpj) 即可。

时间复杂度 Θ(n)

注意:为了代码简介,我们规定 dp0=sum0=1,这样就可以省去 X1,i。因为每一次 sumi 都会多 1,加起来就正好为 X1,n

Code

#include <bits/stdc++.h>  
#define int long long  
#define re register  
  
using namespace std;  
  
const int N = 2e5 + 10,mod = 998244353;  
int n;  
int dp[N],sum[N];  
string s;  
  
signed main(){  
    ios::sync_with_stdio(0);  
    cin.tie(0);  
    cout.tie(0);  
    cin >> n >> s;  
    s = ' ' + s;  
    dp[1] = s[1] - '0';  
    sum[1] = dp[1] + 1;  
    for (re int i = 2;i <= n;i++){  
        dp[i] = (10 * dp[i - 1] + (s[i] - '0') * sum[i - 1]) % mod;  
        sum[i] = (sum[i - 1] + dp[i]) % mod;  
    }  
    printf("%lld",dp[n]);  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18262940

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示