n 维组合 - 如何确定点是否相互看到(如果它们在同一轴上)

Combinations in n-dimensions - How determine if Points see each other (If they are on same axis)

n维网格(最大10^7维)是两个点。他们在每个轴上都有假想的传感器。 我需要算法来计算当这两点可以发现自己时所有可能的选项。

正式写自我的任务文档(翻译成英文):
A 与坐标 (a1, a2, ..., an)B 与坐标 (b1, b2, ..., bn) 是 n 维 space 中的两个点并且存在 i ∈ 1, 2, ..., n 使得 ai = bi然后A和B见面

示例:
一维space中,长度为10一共45个组合怎么放2分 when they see each other(他们每次都看到对方)。 很容易组合 10C2 (10 of 2) = 45

如何通过程序计算2,3,4,...,10^7维(我更喜欢C#)?

正确的测试数据我有:
输入:
1
10
输出:45

输入:
2
5 8
输出:220

输入:
3
8 12 11
输出:14784

更多解释:
当 space 中的两个点相互看到(在同一轴上)时,输出是组合数。在 1 维中 space 只有一个轴,所以他们总是看到对方。在 2 维 space 是 2 轴,所以他们只能在某些情况下看到对方

This image example explaining more than text i think

我已经创建了示例代码,您可以尝试一下。我检查过它工作正常。

等式是:C(n,r)=n!/(r!(n−r)!)

示例: 1.10C2=45 2.10C3=120

public void Calc()
{
  int result= nCr(10, 3);
}

public int nCr(int n,int r )
{   
   int nValue=1;
   int rValue = 1;
   for (int i = n-r+1; i <= n; i++)
   {
       nValue = nValue*i;
   }
   for (int i = 1; i <= r; i++)
   {
        rValue = rValue*i;
   }
   return nValue/rValue;
}

我确定是正确的。
C(x,y) 是 y 的组合 x。
假设我们有一个维度,我们称之为长度为 8 的 X。有 C(8,2) = 8*7/2 = 28 种可能性可以看到彼此。
当我们添加长度为 12 的名为 Y 的第二个维度时,现在我们有 12 条平行于 X 的直线。因此我们有 12*28=336 种可能性可以在所有平行于 X 的直线上找到。现在,在 Y 维度上我们有 C( 12,2) = 66 种可能性。有 8 行这样的行,所以 66*8=528.
总共:336+528=846种可能
现在让我们添加另一个维度,标记为 Z,长度为 11。一行中有 C(1,2) = 11*10/2 = 55,并且(注意)我们有 8*12 行。那么是不是55*8*12 = 5280种可能!
现在我们总共有:
与 X 轴平行:C(8,2)*11*12 = 3696
平行于Y轴 C(12,2)*8*11 = 5808
平行于Z轴 C(11,2)*8*12 = 5280
总计 = 14784

一般来说,具有 n1,n2...nk 长度的 n 维的公式是:
C(ni,2) * (n1*n2...*nk)/ni
之和 或者更短: (n1*n2*n3...nk)/2 * (ni-1)

的总和

示例: 尺寸为 3,8,9,11:
(3*8*9*11)/2*(3-1) = 2376
(3*8*9*11)/2*(8-1) = 8316
(3*8*9*11)/2*(9-1) = 9504
(3*8*9*11)/2*(11-1) = 11880
总计 = 32076

最简单的方程式:
(n1*n2*n3...ni)(n1+n2+...ni - k)/2,其中ni是长度,k是维数