C. Partitioning the Array - 思维 + gcd

文章讲述了如何通过分析模运算性质解决一个问题:给定数组中,找到使得所有相同位置元素差值的绝对值对某个数取模等于0的子数组个数。代码给出了使用C++实现的解决方案,通过计算各子数组绝对值差的最大公约数来确定答案。
摘要由CSDN通过智能技术生成

题面

分析

如果让两个数满足对某一个数取模后相等,那么也就是 x m o d m = y m o d m x mod m = y mod m xmodm=ymodm,那么也就是 ( x − y ) m o d m = = 0 m o d m (x - y) mod m == 0 mod m (xy)modm==0modm,因此可以推出,对于每一个子数组的相同位置都要满足二者绝对值之差对某一个数取模能够等于0,那么也就是众多绝对值之差的最大公约数,如果最大公约数存在,那么也就存在一个符合的答案。

代码
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 2e5 + 10;

int a[N];

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

void solve() {
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    ll ans = 0;
    vector<int> x;
    for(int i = 1; i <= n / i; i ++) {
        if(n % i == 0) {
            x.push_back(i);
            if(i != n / i) x.push_back(n / i);
        }
    }
    for(auto j: x) {
        int sum = 0;
        for(int i = 1; i + j <= n; i ++) sum = gcd(sum, abs(a[i] - a[i + j]));
        if(sum != 1) ans ++;
    }
    cout << ans << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while(T --) {
        solve();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值