如何找到其乘积可以表示为 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 个随机整数的平方差的连续子序列/子数组的数量?的主要内容,如果未能解决你的问题,请参考以下文章