细节题

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;
}

posted @   小菜珠的成长之路  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示