首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算“坏”值的数目

计算“坏”值的数目
EN

Stack Overflow用户
提问于 2019-06-11 06:19:31
回答 1查看 135关注 0票数 1

我当时正在解决一个问题,却遇到了这个问题。

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

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

如果没有方法获得一个值v的球,那么让我们将值v (v>0)称为坏值;否则,值v是好的。我们想用所有的好值来制造球,并且我们想知道坏值的数量。

注意:有无限个好的球值,但是可以证明,对于Y≥2,坏值的数量总是有限的。

对于给定的X和Y,设计一个过程来查找坏值的数量。

例如。

代码语言:javascript
复制
X = 1 ; Y = 2

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

代码语言:javascript
复制
X = 3 ; Y = 3  

我们得到了[3, 3 + 3 - 1] == [3, 5] == {3, 4, 5}球。回答2;不能生成带有12值的球。

我认为小于X的值是不可能形成的,但它似乎是错误的,也许我遗漏了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 07:44:13

在解决这些问题时,从开始玩数字。假设给我们2球(Y = 2),让它们是1112 (X = 11)。我们可以创造

  • 来自1 ball:1112
  • 来自2之球:222324
  • 来自3之球:33343536
  • 来自4球:4445464748

……

然而,我们有漏洞(糟糕的数字):1..10 of size,1013..21 of size,925..32 of size 8。你能看到图案吗?孔数之和(坏数的数目)是

代码语言:javascript
复制
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 == 55

现在我们可以解决这个问题,如果Y = 2:它是拟序级数之和

代码语言:javascript
复制
X - 1 + X - 2 + ... + 2 + 1 == (X - 1) * (X - 2) / 2 

Y = 3上继续做下去,例如,我们被赋予了3权(Y = 3) 11, 12, 13 (X = 11)。我们可以创造:

  • 来自1 ball:111213
  • 来自2球:2223242526
  • 来自3球:33343536373839
  • 来自4球:444546474849505152

让我们数一下洞:1..10,然后是14..21,然后是26..33,后面是40..43

代码语言:javascript
复制
10 + 8 + 6 + 4 + 2 == 30

你能看到图案吗?你能为Y = 3解答吗?请注意不同之处:

代码语言:javascript
复制
 X = 11; Y = 2   ->   10 + 9 + 8 + 7 + ... + 1
 X = 11; Y = 3   ->   10 + 8 + 6 + 4 + 2

你现在能写出Y = 3的公式了吗?为了Y = 4Y = 5

代码语言:javascript
复制
 X = 11; Y = 4   ->   10 + 7 + 4 + 1
 x = 11; Y = 5   ->   10 + 6 + 2

适用于任意Y

代码语言:javascript
复制
 X = 11; Y       ->   10 + (10 - 1 * (Y - 1)) + (10 - 2 * (Y - 1)) + ...

对于任意的XY (我们必须把所有的正项加起来)?

代码语言:javascript
复制
 X; Y            ->   (X - 1) + (X - 1 - 1 * (Y - 1)) + (X - 1 - 2 * (Y - 1)) + ...

代码:让它成为C#

代码语言:javascript
复制
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
}

一些测试(或演示):

代码语言:javascript
复制
(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);

结果:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56537609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档