组合理论的一个问题
A problem of taking combination for set theory
给定一个尺寸为n的数组a。数组a的子集的值定义为该子集中所有数字的乘积。我们必须返回所有可能的非空数亚集的值的乘积a%(10^9 7(。
例如。数组a {3,5}
`值{3} = 3, 值{5} = 5, 值{3,5} = 5*3 = 15
答案= 3*5*15%(10^9 7(。
有人可以解释问题背后的数学。我正在考虑通过组合解决它来有效地解决它。
我尝试使用蛮力给出了正确的答案,但是它太慢了。下一个方法是使用组合。现在,我认为,如果我们采用所有集合并乘以这些集合中的所有数字,那么我们将获得正确的答案。因此,我必须找出计算答案的数字有多少次。在示例5和3中,两次都到了2次。如果我们仔细观察,则每个数字的次数都相同。
您要朝正确的方向前进。
令x
为给定数组A
的元素。在我们的最终答案中,x
出现p
次数,其中p
等于包括x
的A
子集的数量。
如何计算p
?一旦我们决定将x
包括在我们的子集中,我们就有两个选择的N-1
元素:将它们包括在set中或不包含。因此,我们得出结论p = 2^(N-1)
。
因此,A
的每个元素在最终产品中完全出现2^(N-1)
次。所有遗骸都是计算答案:(a1 * a2 * ... * an)^p
。由于指数很大,因此您可以使用二进制指数进行快速计算。
正如Matt Timmermans在下面的评论中所建议的那样,我们可以在不实际计算p = 2^(N-1)
的情况下获得答案。我们首先计算产品a1 * a2 * ... * an
。然后,我们只是将此产品与n-1
次保持平衡。
C 中的相应代码:
int func(vector<int> &a) {
int n = a.size();
int m = 1e9+7;
if(n==0) return 0;
if(n==1) return (m + a[0]%m)%m;
long long ans = 1;
//first calculate ans = (a1*a2*...*an)%m
for(int x:a){
//negative sign does not matter since we're squaring
if(x<0) x *= -1;
x %= m;
ans *= x;
ans %= m;
}
//now calculate ans = [ ans^(2^(n-1)) ]%m
//we do this by squaring ans n-1 times
for(int i=1; i<n; i++){
ans = ans*ans;
ans %= m;
}
return (int)ans;
}
让 a = {a,b,c}
A is = {{},{a},{b},{c},{a,b},{b,c},{c,a},{a,b,b,c,d}的所有可能子集}
这里每个元素的发生数量是4次。
因此,如果a = {a,b,c,d},则每个元素的出现数量为2^3。
因此,如果A的大小为N,则每个元件的出现数量将为2^(n-1(
因此,最终结果将为= a1^p*a2^ p a3^p ....*an^p
其中p为2^(n-1(我们需要解决x^2^(n-1(%mod。
我们可以将x^2^(n-1(%mod写成x^(2^(n-1(%phi(mod((%mod。链接
因为mod是素数,然后phi(mod(= mod-1。
首先找到p = 2^(n-1(%(mod-1(。
然后为每个数字中的每个数字找到ai^p%mod,然后与最终结果相乘。
我阅读了以前的答案,我正在理解制作集的过程。因此,在这里,我试图将其放入尽可能简单的地方,以便他们可以将其应用于类似的问题。
让我成为数组A的元素A。在问题中给出的方法之后,我在最终答案中出现了p次数。
现在,我们如何制作不同的集合。我们仅使用一个包含一个元素的集合,然后集合包含两个组的组,然后包含3个元素组。现在,我们想知道,每次我们制作一组数字的集合说3个要素时,其中有多少个包含i?有n个元素,因此对于总是包含i的3个元素集的集合,组合为(n-1(c(3-1(,因为从n-1元素中我们可以选择3-1个元素。如果我们为每个组这样做,则p = [(n-1(c(x-1(],m从1到n。因此,p = 2^(n-1(。
对于每个元素i,p都一样。这样我们就得到了最终答案= a [0]^p *a [1]^p ...... a [n]^p
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 在C++,重复申报仍然是一个问题吗?
- "Memory Fragmentation"这仍然是一个问题?
- 缺少类型说明符和另一个问题
- 在浮点精度成为一个问题之前,可以将多少个浮点值加在一起
- 关于使用C++结构的一个问题
- 关于骰子概率计算的一个C++问题
- 我想知道我将如何实现 + 运算符重载.我已经从我上一个问题中计算出 += 运算符重载
- 组合理论的一个问题
- 我有一个问题,创建了C 中阻塞队列的向量
- CreateFileWindows XP和7中存在一个问题
- 我是编码新手,我面临一个问题
- 在添加新记录和访问记录时有一个问题
- 专用纯虚拟模板函数(未定义引用)的另一个问题
- 在C++中,这个Eigen::张量的声明是安全的,还是有缺陷的?我应该为它提交一个问题吗
- 我如何让我的部分代码循环并重复一个问题,直到答案是有效的输入C++
- 我的程序停止工作,因为检测到一个问题