链接: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;
}
}