[同余][前缀和]K倍区间

若一段连续子序列[l, r]和为k的倍数

则必定有 sum[r] - sum[l - 1] % k == 0

由同余定理 sum[r] % k == sum[l - 1] % k

由输入数据顺序则必定有已输入数据均在当前数据之前

则可用brr数组记录当前数之前的所有模数 得解

typedef long long ll;

const int MAXN = 1e6 + 10;

ll arr[MAXN] = {0};
ll brr[MAXN] = {0};

int main()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0);     cout.tie(0);
    //freopen("D://test.in", "r", stdin);
    //freopen("D://test.out", "w", stdout);
    
    int n, m;

    ll ans = 0;

    cin >> n >> m;

    for(int i = 1, t; i <= n; i++)
        cin >> arr[i], arr[i] += arr[i - 1], ans += brr[arr[i] % m]++;

    ans += brr[0];

    cout<<ans<<'
';

    return 0;
}
原文地址:https://www.cnblogs.com/zeolim/p/12270402.html