【CF 1195 D2】Submarine in the Rybinsk Sea (hard edition)

xiu~
题目其实理解了就很简单。首先,数据提醒我们用O(n)来解决。画画样例发现,一个位数为n的数对位数>=n的数的影响是一定的。即使对<n的数的影响不定,数据最多只有10位,是允许枚举的。

详见代码。(有点冗长,不过理解就好)

#include<cstdio>
typedef long long ll;
const int mod = 998244353, N = 100002;
int n, t[11];
ll a[N][12], ans, tmp, pre[N], w;
int main() {
 int tt;
 scanf("%d", &n);
 for(int i = 1; i <= n; i ++) {
  scanf("%lld", &tt);
  tmp = tt;
  while(tmp) {
   a[i][++ a[i][0]] = tmp % 10;
   tmp /= 10;
  }
  t[a[i][0]] ++;
 }
 for(int i = 10; i >= 1; i --)
  pre[i] = pre[i + 1] + t[i];
 for(int i = 1; i <= n; i ++) {
  for(int j = 1; j < a[i][0]; j ++) {
   if(! t[j])
    continue;
   tmp = a[i][1];
   w = 1;
   for(int u = 2; u <= j + 1; u ++) {
    w = (w * 100) % mod;
    tmp = (tmp + a[i][u] * w) % mod;
   }
   for(int u = j + 2; u <= a[i][0]; u ++) {
    w = ((w << 1) + (w << 3)) % mod;
    tmp = (tmp + a[i][u] * w) % mod;
   }
   ans = (ans + tmp * t[j] % mod) % mod;
   w = 10;
   tmp = ((a[i][1] << 1) + (a[i][1] << 3)) % mod;
   for(int u = 2; u <= j; u ++) {
    w = (w * 100) % mod;
    tmp = (tmp + a[i][u] * w) % mod;
   }
   for(int u = j + 1; u <= a[i][0]; u ++) {
    w = ((w << 1) + (w << 3)) % mod;
    tmp = (tmp + a[i][u] * w) % mod;
   }
   ans = (ans + tmp * t[j] % mod) % mod;
  }
  tmp = a[i][1];
  w = 1;
  for(int u = 2; u <= a[i][0]; u ++) {
   w = (w * 100) % mod;
   tmp = (tmp + a[i][u] * w) % mod;
  }
  ans = (ans + tmp * (pre[a[i][0]] - 1) % mod + tmp) % mod;
  w = 10;
  tmp = ((a[i][1] << 1) + (a[i][1] << 3)) % mod;
  for(int u = 2; u <= a[i][0]; u ++) {
   w = (w * 100) % mod;
   tmp = (tmp + a[i][u] * w) % mod;
  }
  ans = (ans + tmp * (pre[a[i][0]] - 1) % mod + tmp) % mod;
 }
 printf("%lld\n", ans % mod);
 return 0;
}

如有错误,请大佬在评论区指出。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值