题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4437
题意:给你n个数,问两两相加会产生多少次进位
解题思路:考虑进位的位置即可, 首先枚举10, 100, 1000..., 1e9,达到了才会产生进位,对于每一次枚举10^t, 就是在n个数中对于每一个数x % 10^t, 所有的数模10^t之后, 二分以下不小于10^t - x的数有多少个
#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <bitset>
#include <functional>
#include <vector>
#include <set>
#include <map>
using namespace std;
#define LL long long
const int INF=0x3f3f3f3f;
long long a[100010];
long long b[100010];
long long c[12]={1};
int main()
{
for(int i=1;i<12;i++) c[i]=c[i-1]*10;
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
long long ans=0;
for(int i=1;i<=9;i++)
{
for(int j=0;j<n;j++)
b[j]=a[j]%c[i];
sort(b,b+n);
for(int j=0;j<n;j++)
{
int l=j+1,r=n,k=n;
while(l<=r)
{
int mid=(l+r)/2;
if(b[mid]+b[j]>=c[i]) {r=mid-1,k=mid;}
else l=mid+1;
}
ans+=n-k;
}
}
printf("%lld\n",ans);
}
}