Carries
frog has nn integers a1,a2,…,ana1,a2,…,an, and she wants to add them pairwise.
Unfortunately, frog is somehow afraid of carries (进位). She defines hardness h(x,y)h(x,y) for adding xx and yy the number of carries involved in the calculation. For example, h(1,9)=1,h(1,99)=2h(1,9)=1,h(1,99)=2.
Find the total hardness adding nn integers pairwise. In another word, find
∑1≤i<j≤nh(ai,aj)∑1≤i<j≤nh(ai,aj)
.Input
The input consists of multiple tests. For each test:
The first line contains 11 integer nn (2≤n≤1052≤n≤105). The second line contains nn integers a1,a2,…,ana1,a2,…,an. (0≤ai≤1090≤ai≤109).
Output
For each test, write 11 integer which denotes the total hardness.
Sample Input
2
5 5
10
0 1 2 3 4 5 6 7 8 9Sample Output
1
20题解:
判断两个数相加的第i位是否需要进位只需判断
x%(i^10)+y%(i^10)与i^10的关系即可。
若x%(i^10)+y%(i^10)>=i^10成立,则当z%(i^10)>=y%(i^10)时也一定成立
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100004],b[100004];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)scanf("%d",&a[i]);
int mod=1;
ll ans=0;
for(int i=1; i<=9; i++)
{
mod*=10;
for(int j=0; j<n; j++)b[j]=a[j]%mod;
sort(b,b+n);
for(int j=0; j<n; j++)
{
int pos=lower_bound(b+j+1,b+n,mod-b[j])-b;
ans=ans+n-pos;
}
}
printf("%lld\n",ans);
}
return 0;
}
本文介绍了一种算法,用于计算给定整数集合中任意两数相加时产生的进位总数。通过逐位比较并利用排序与二分查找的方法,有效地解决了这一问题。
708

被折叠的 条评论
为什么被折叠?



