B. Carries
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:
%lld Java class name:
Main
frog has
n integers
a1,a2,…,an , and she wants to add them pairwise.
Unfortunately, frog is somehow afraid of carries (进位). She defines \emph{hardness}
h(x,y) for adding
x and
y the number of carries involved in the calculation. For example,
h(1,9)=1,h(1,99)=2 .
Find the total hardness adding
n integers pairwise. In another word, find
∑1≤i<j≤nh(ai,aj)
.
Input
The input consists of multiple tests. For each test:
The first line contains
1 integer
n (
2≤n≤105 ). The second line contains
n integers
a1,a2,…,an . (
0≤ai≤109 ).
Output
For each test, write
1 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
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 100000 + 10
int n, a[N], b[N], x[12];
int main()
{
x[0] = 1;
for(int i = 1; i <= 9; i++) x[i] = x[i - 1] * 10;
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
long long ans = 0;
for(int k = 0; k <= 9; k++)
{
for(int i = 0; i < n; i++)
b[i] = a[i] % x[k];
sort(b, b + n);
for(int i = 0; i < n; i++)
{
int tmp = x[k] - b[i];
int pos = lower_bound(b, b + n, tmp) - b;
ans += n - pos;
if(pos <= i) ans--;
}
}
printf("%lld\n", ans >> 1);
}
return 0;
}
/*
2
5 5
10
0 1 2 3 4 5 6 7 8 9
*/