ARC136C Circular Addition [高维前缀和]

Description

给定一个长度为 \(n\) 的正整数序列 \(A\),求有多少对 \((i,j)\) 使得 \(A_i+A_j\) 不发生进位操作。
\(A_i<10^6\)

Solution

显然对于每个 \(A_i\),设 \(B_i=999999-A_i\),那么 \(A_i\) 可以和 所有位上的数 都小于等于 \(B_i\) 对应位上的数 的数匹配,考虑用桶加前缀和统计(相当于是个 \(6\) 维前缀和)。
然后对于每位都 \(\le 4\) 的数,是会和它自己匹配的,所以要减 \(1\)
最后答案 \(/2\) 即可。

Code

const int N = 1e6 + 5;

int n, a[N];
int p[6] = {1, 10, 100, 1000, 10000, 100000};
ll sum[N], ans;

void Solve(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        sum[a[i]]++;
    }
    for(int i = 0; i < 6; i++){
        for(int j = 0; j < 1000000; j++){
            if(j / p[i] % 10){
                sum[j] += sum[j - p[i]];
            }
        }
    }
    for(int i = 1; i <= n; i++){
        ans += sum[999999 - a[i]];
        bool flag = true;
        for(int j = 0; j < 6; j++){
            if(a[i] / p[j] % 10 >= 5){
                flag = false;
                break;
            }
        }
        if(flag) ans--;
    }
    cout << ans / 2 << endl;
}
posted @ 2024-10-10 16:25  chenwenmo  阅读(4)  评论(0编辑  收藏  举报