Algorithm 计数“的数量;“坏的”;价值观

Algorithm 计数“的数量;“坏的”;价值观,algorithm,Algorithm,我在解决一个问题时遇到了这个问题 假设我们有一些粘土球。每个球都有一定的价值;每个球的值可以是任何正整数。最初,对于X和X+Y之间的每个值−1(含),我们有无限的球供应与此值 这些球有一个特殊的属性:它们中的任意两个可以混合以创建一个新球。如果原始球的值为a和b(可能为a=b),则新球的值为a+b。以这种方式创建的球也可用于混合其他球。我们可以自由地以任何方式混合球,我们可以选择任何次数 如果无法获得一个值为v的球,我们就称其为v(v>0)坏球;否则,值v是好的。我们想要制造出所有好值的球,我们

我在解决一个问题时遇到了这个问题

假设我们有一些粘土球。每个球都有一定的价值;每个球的值可以是任何正整数。最初,对于X和X+Y之间的每个值−1(含),我们有无限的球供应与此值

这些球有一个特殊的属性:它们中的任意两个可以混合以创建一个新球。如果原始球的值为a和b(可能为a=b),则新球的值为a+b。以这种方式创建的球也可用于混合其他球。我们可以自由地以任何方式混合球,我们可以选择任何次数

如果无法获得一个值为v的球,我们就称其为v(v>0)坏球;否则,值v是好的。我们想要制造出所有好值的球,我们想知道坏值的数量

注:球的好值有无限多个,但可以证明Y的坏值的数量总是有限的≥二,

对于给定的X和Y,设计一个程序来找出错误值的数量

例如

我们得到了
[1,1+2-1]=[1,2]={1,2}
球。回答0;因为可以根据X和Y获得具有所有可能值的球

X = 3 ; Y = 3  
我们得到了
[3,3+3-1]=[3,5]={3,4,5}
球。 回答2;无法制作具有值
1
2
的As球


我认为小于X的值是无法生成的,但它似乎是错误的,也许我遗漏了什么。

解决此类问题时,请从玩数字开始。假设我们得到了
2
球(
Y=2
),让它们成为
11
12
X=11
)。我们可以创造

  • 1
    ball:
    11
    12
  • 2
    球:
    22
    23
    24
  • 3
    球:
    33
    34
    35
    36
  • 4
    球:
    44
    45
    46
    47
    48

但是我们有洞(坏数字):
1..10
大小
10
然后
13..21
大小
9
然后
25..32
大小
8
。你能看到图案吗?孔总数(坏数的数量)为

现在我们可以解决Y=2的问题了:它是自然级数的和

继续做
Y=3
,例如,我们得到
3
球(
Y=3
11,12,13
X=11
)。我们可以创造:

  • 1
    球:
    11
    12
    13
  • 2
    球:
    22
    23
    24
    25
    26
  • 3
    球:
    33
    34
    35
    36
    37
    38
    39
  • 4
    球:
    44
    45
    46
    47
    48
    49
    50
    51
    52
让我们数一数漏洞:
1..10
然后
14..21
然后
26..33
然后是
40..43

10 + 8 + 6 + 4 + 2 == 30
你能看到图案吗?你能解出Y=3吗?请注意区别:

 X = 11; Y = 2   ->   10 + 9 + 8 + 7 + ... + 1
 X = 11; Y = 3   ->   10 + 8 + 6 + 4 + 2
你现在能写出Y=3的公式吗?对于
Y=4
Y=5

 X = 11; Y = 4   ->   10 + 7 + 4 + 1
 x = 11; Y = 5   ->   10 + 6 + 2
对于任意
Y

 X = 11; Y       ->   10 + (10 - 1 * (Y - 1)) + (10 - 2 * (Y - 1)) + ...
对于任意的
X
Y
(我们必须对所有正项求和)

代码:让它成为C

private static int MySum(int X, int Y) {
  int d = Y - 1;                  // difference
  int n = (X - 1) / (Y - 1) + 1;  // number of items to sum

  int A1 = X - 1;                 // 1st item
  int An = X - 1 - (n - 1) * d;   // last item

  return (A1 + An) * n / 2;       // sum of arithmetic progression
}
一些测试(或演示):

(int, int)[] tests = new (int, int)[] {
   (X : 11, Y : 2),
   (X : 11, Y : 3),
   (X : 11, Y : 4),
   (X : 11, Y : 5),
   (X :  1, Y : 2),
   (X :  3, Y : 3),
};

string demo = string.Join(Environment.NewLine, tests
  .Select(test => $"X = {test.Item1,2}, Y = {test.Item2} => {MySum(test.Item1, test.Item2),2}"));

Console.Write(demo);
X = 11, Y = 2 => 55
X = 11, Y = 3 => 30
X = 11, Y = 4 => 22
X = 11, Y = 5 => 18
X =  1, Y = 2 =>  0 // test from the question
X =  3, Y = 3 =>  2 // test from the question
结果:

(int, int)[] tests = new (int, int)[] {
   (X : 11, Y : 2),
   (X : 11, Y : 3),
   (X : 11, Y : 4),
   (X : 11, Y : 5),
   (X :  1, Y : 2),
   (X :  3, Y : 3),
};

string demo = string.Join(Environment.NewLine, tests
  .Select(test => $"X = {test.Item1,2}, Y = {test.Item2} => {MySum(test.Item1, test.Item2),2}"));

Console.Write(demo);
X = 11, Y = 2 => 55
X = 11, Y = 3 => 30
X = 11, Y = 4 => 22
X = 11, Y = 5 => 18
X =  1, Y = 2 =>  0 // test from the question
X =  3, Y = 3 =>  2 // test from the question

想象一下,
X=11,Y=2
所以你得到了
11
12
的球:你不能创建
13
14
,…
21
25
等等。我不认为坏值的数量是有限的。如果你有两个偶数的球,比如说2和4,你如何得到奇数的球?@ChatterOne:那是不可能的:你得到了一个范围,例如,如果
X=2,Y=3
这意味着你有
[2,2+3-1]
-
{2,3,4}
balls@DmitryBychenko哦,我误解了你只是有两个值而不是一个范围。好吧,那么。@DmitryBychenko现在我明白了,但是我们怎么能计算这些值呢?这太优雅了!非常感谢你的解释。你能检查一下吗?我在答案中尝试了实现,但在某些情况下失败了。@Steve:gcd的最大化和似乎是一个完全不同的问题;这里我们有一个求和的自然级数(a1=
X-1
,difference=
Y-1
等等)。我同意这是一个完全不同的问题,只是想对它有一些了解。还有一个疑问,我们如何找到N,即使用a.P公式求和的项数?Sn=[n*(2*a+(n-1)*d)]/2
(int, int)[] tests = new (int, int)[] {
   (X : 11, Y : 2),
   (X : 11, Y : 3),
   (X : 11, Y : 4),
   (X : 11, Y : 5),
   (X :  1, Y : 2),
   (X :  3, Y : 3),
};

string demo = string.Join(Environment.NewLine, tests
  .Select(test => $"X = {test.Item1,2}, Y = {test.Item2} => {MySum(test.Item1, test.Item2),2}"));

Console.Write(demo);
X = 11, Y = 2 => 55
X = 11, Y = 3 => 30
X = 11, Y = 4 => 22
X = 11, Y = 5 => 18
X =  1, Y = 2 =>  0 // test from the question
X =  3, Y = 3 =>  2 // test from the question