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