丛林木马 数学,取模,高精度 牛客白月赛44

链接:https://ac.nowcoder.com/acm/contest/11221/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
朽木裂,雷霆惊,丛林木马怒冲天。

众所周知,如果给你两个数 a,ba,b 要你计算 a\times b=ca×b=c 的值,你就知道要这么做:把每一位相乘并且乘上它们的 10^k10
k
然后相加,其中 kk 表示对应数位的幂次。

有一次,可怜的 ZM 不小心把“相乘”中的所有乘法运算都算成了加法,她想让你帮忙算算,这样算出来的结果是多少?
输入描述:
全文第一行输入一个整数 T(1\le T\le10^5)T(1≤T≤10
5
),表示数据组数。

每行输入两个正整数 a,b(1\le a,b\le10{105})a,b(1≤a,b≤10
10
5

),表示两个因数。

数据保证 \sum |a|,\sum |b|\le10^6∑∣a∣,∑∣b∣≤10
6
,其中 |a|,|b|∣a∣,∣b∣ 表示两个数的位数。
输出描述:
每行输出一个数表示你计算出的答案,为方便输出,你只需要输出最终结果对 998244353998244353 取模后的值即可。
示例1
输入
复制
4
12 13
123 456
1314520 5201314
998244353 100000007
输出
复制
50
1737
45610838
900000063
说明
对于样例 #1:把每一位拆开并且相加,每一个和统计出来:20+13+12+5=5020+13+12+5=50。

对于样例 #2:

它们的和是:500+150+106+420+70+26+403+53+9=1737500+150+106+420+70+26+403+53+9=1737。

思路 :

  • 改乘法为加法后,相当于每个数和另一个数位上的数相加,所以会加(对方的数位)那么多次,受启发,将两个数分别拆成若干个数,列出如下表格
  • 例如 123 和 456
    在这里插入图片描述
  • 可以看到400,50,6,100,20,3 都分别被加了三次,所以123被加了3次,456被加了三次,因此 答案就是a∗(b的数位数)+b∗(a的数位数)
  • 由于给的两个数可能 长度 达到 1 0 6 10^6 106级别,因此不能常规做法,我们这里采用取模
#include <iostream>
using namespace std;

typedef long long ll;

const ll mod = 998244353;

int main()
{
    int _; cin >> _;
    while (_ -- )
    {
        string a, b; cin >> a >> b;
        ll x = 0, y = 0;
        for (int i = 0; i < a.size(); i ++ )
            x = (x * 10 + (a[i] - '0')) % mod;
        
        for (int i = 0; i < b.size(); i ++ )
            y = (y * 10 + (b[i] - '0')) % mod;
            
        cout << (x * b.size() % mod + y * a.size() % mod) % mod << endl;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值