如何找到其乘积可以表示为 2 个随机整数的平方差的连续子序列/子数组的数量?

Posted

技术标签:

【中文标题】如何找到其乘积可以表示为 2 个随机整数的平方差的连续子序列/子数组的数量?【英文标题】:How to find the number of contiguous subsequences / subarrays whose product can be expressed as difference of squares of 2 random integers? 【发布时间】:2020-04-03 15:25:18 【问题描述】:

所以,假设给定的序列是 2,1,3,4。满足问题条件的连续子​​序列将是 1,3,4,1,3,1,3,4,3,4,2,1,3 ,4。因此连续子序列/子数组的总数为7。

我的方法:我做了一些数学运算,发现所有奇数或能被 4 整除的数字都满足问题的条件。但是当我尝试编写程序时,在最坏的情况下需要 O(n2) 来检查每个连续的子序列/子数组。你能帮我想出一个优化的方法吗?

【问题讨论】:

你的序列有最大值吗? 是的,最多可以有 10^5 个值,元素的范围可以在 0 到 10^9 之间 这个问题似乎是ongoing contest的一部分。 这个帖子绝对应该被撤下,直到比赛结束。 这个问题是codechef.com/APRIL20B/problems/SQRDSUB 的一部分,问题正在处理中。请避免在正在进行的比赛中提问。 【参考方案1】:

任何数字都可以表示为奇数或 4 的倍数的平方差。 当产品在素因数分解中只有一个 2 时,就会出现问题。所以我们可以标记它们。 (即所有2个) 鉴于此,我们可以很容易地推断出对于给定条件,只有不是有效子数组的才是

[odd, 2, odd, 4*n, odd]
[0,   1,   2,    3,   4]

我们可以看到位置 3 将不在任何有效子数组中,因此您可以计算左侧和右侧的赔率。 位置 1 参与的子数组的数量 无效的子数组是 [odd, 2], [2,odd], [2], [odd, 2,odd]

减去 15 - 4,因此答案是 11。

对每个在素因数分解中只有一个 2 的数字执行此操作。

【讨论】:

【参考方案2】:

只有当它是奇数或能被 4 整除时,一个数才能表示为两个平方的差。

int main()


    long long int t, n, i, j, a[100000];

    cin >> t;

    while (t--)
    

        int c = 0, d = 0;

        long long int sum = 1;

        cin >> n;

        for (i = 0; i < n; i++)
            cin >> a[i];

        for (i = 0; i < n; i++)
        

            if (a[i] % 2 != 0 || a[i] % 4 == 0)

                d++;
            sum = a[i];
            for (j = i + 1; j < n; j++)
            

                sum = sum * a[j];

                cout << sum << endl;

                if (sum % 2 != 0 || sum % 4 == 0)

                    c++;
            

            sum = 1;
        

        cout << c + d << endl;
    

    return 0;

【讨论】:

以上是关于如何找到其乘积可以表示为 2 个随机整数的平方差的连续子序列/子数组的数量?的主要内容,如果未能解决你的问题,请参考以下文章

java2亿个随机生成的无序整数,如何找到其中位数

蓝桥杯-2/14天-完全平方数另类思路

数学期望,方差的计算公式是??

LeetCode 343.整数拆分 - JavaScript

找到以 K 为因子的最小长度区间

小三学算术