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
思路:一对一对的枚举铁定会超时.所以首先要解决这个问题.二分的时间复杂度为logn可以.
那么,还要解决进位的问题.b[j]=a[i]%tmp^k;
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<algorithm>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
ll a[100000],b[100000];
int main()
{
long long n,m,i,j,k;
while(~scanf("%lld",&n))
{
for(i=0; i<n; i++)
scanf("%lld",&a[i]);
ll tmp=1;
ll ans=0;
for(i=0; i<9; i++) //最多为10^9
{
tmp*=10;
for(j=0; j<n; j++)
b[j]=a[j]%tmp;
sort(b,b+n);//为二分先排序,并且不影响进位的次数
for(j=0; j<n; j++)
{
ll l=j+1,r=n;
while(l<r)
{
int mid=(l+r)>>1;
if(b[mid]+b[j]>=tmp)
r=mid;
else
l=mid+1;
}
ans+=n-r;
}
}
printf("%lld\n",ans);
return 0;
}
}