细节题
ABC238 C - digitnum
题目链接
https://atcoder.jp/contests/abc238/tasks/abc238_c
解析
是一个比较容易找规律的数学题,坑点在于取模,史上见过最恶心的取模题,很多很多地方都容易爆long long.
对于式子:((a + 1) * a / 2)% mod的分析,a为long long
- a * (a + 1)为偶数,可以直接/2,不用转化成*2的逆元
- 对(a + 1)和 a 分别取模再相乘,一定要记得加括号,要不然会默认从左往右乘
Ac代码
点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
ll get(int n){
ll ans = 1;
for(int i = 1; i < n; i ++) ans *= 10; //最小的n位数
return ans;
}
ll n;
int main()
{
scanf("%lld", &n);
ll m = n, t = 0;
while(m > 0){
m /= 10;
t ++;
}
ll ans = 0;
for(int i = 1; i < t; i ++){
ll x = get(i);
ll num = 9 * x % mod;
ans = (ans + ((num % mod) * ((1 + num) % mod) / 2)) % mod;
//cout << (num % mod * (1 + num) % mod / 2) % mod << endl;
}
n = (n - get(t) + 1);
ans = (ans + (n % mod) * ((1 + n) % mod) / 2) % mod;
printf("%lld\n", ans);
return 0;
}

浙公网安备 33010602011771号