SCU4437-Carries

来源:互联网 发布:软件杂志编委 编辑:程序博客网 时间:2024/06/17 20:46

题目链接: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 longconst 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);}}

0 0