传送门:Carries
题目大意
第一行给出一个数N,然后下面的N个数,
判断任意两个数的进位之和。
例如h(35,82) = 1,h(1,99) = h(99,1) = 2;
解题思路
我们可以把低位向高位开始算,如果有进位那么就+1,最多就是9位数,就来依次枚举这九位数进行判断,对于每个得到的低位数我们先排序然后进行二分查找,更新答案;
AC代码
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 1e5 + 5;
LL A[MAXN],tmp[MAXN];
int main()
{
int N;
while(~scanf("%d",&N))
{
LL ans = 0,mod = 1;
for(int i=1;i<=N;i++) scanf("%lld",&A[i]);
for(int k=1;k<=9;k++){
mod*=10;
for(int i=1;i<=N;i++)tmp[i] = A[i]%mod;
sort(tmp+1,tmp+1+N);
for(int i=1;i<=N;i++) ans+=N-(lower_bound(tmp+i+1,tmp+1+N,mod-tmp[i])-tmp)+1;
}
printf("%lld\n",ans);
}
return 0;
}