【问题标题】:How to find the number of contiguous subsequences / subarrays whose product can be expressed as difference of squares of 2 random integers?如何找到其乘积可以表示为 2 个随机整数的平方差的连续子序列/子数组的数量?
【发布时间】: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 的一部分,问题正在处理中。请避免在正在进行的比赛中提问。

标签: c++ algorithm math


【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 2020-08-11
      • 2012-08-23
      • 2020-07-20
      • 2021-05-27
      • 2020-09-18
      • 2020-07-17
      • 2018-12-30
      • 1970-01-01
      相关资源
      最近更新 更多