我有一个非常简单的问题。我将获得算术进展的第一个术语和常见的差异。我需要在L和R的范围之间给出所有数字的总和。这里的总和意味着总数< 10表示对于一个数字表示157,数字的总和是1 + 5 + 7 = 13进一步是1 + 3 = 4。范围是元素的索引。 L表示该系列的第L个数,L从1开始。这里L和R的范围可以是1到10 ^ 18。如何在如此大的范围内找到这些数字的总和。我知道数字n的数字和可以计算为(n-1)%9 + 1。但我不能迭代10 ^ 18个数字。
示例:假设第一项算术级数为14且公差为7.然后,2到4之间所有数字的总和将为(2 + 1)= 3和(2 + 8)=( 1 + 0)= 1且(3 + 5)= 8,其等于12
用于模式发现
current=first;
ll arr[10]={0};
while(1)// search for the pattern
{
ll dsum=(current-1)%9+1;// calculating digit sum
if(arr[dsum]!=0)
break;
arr[dsum]=ptr;// saving the value in the array by using hashing
ptr++;
current+=c_diff;
}
for sum
for(ll i=1;i<ptr;i++)
{
sum[i]=sum[i-1]+new_arr[i];
}
答案 0 :(得分:0)
由于您的所有号码都将(最终)缩减为一位数,因此必须在一定数量的条款后重复,并且最多为9.(因为10位数,但是0不可能重复。)
所以,让我们从一个例子开始吧。说,a=14, d=7, l=2, r=50
。我已经从您的示例中更改了r
的值。
所以,试图找到重复:
q
(比如说)。然后,q
的第一个词是5
(因为14 = 5)。我们找到所有条款,直到我们再次获得5。因此,q
在此示例中将如下所示:
q[] = {5,3,1,8,6,4,2,9,7} ... and then we have 5 again, so stop.
所以,我们的重复模式有9个成员。现在,找到一个累积和数组,它将类似于:
sum[] = {5,8,9,17,23,27,29,38,45}
现在,从r=50
开始,找到r
项的总和,这将是:
(floor)(50/9) * 45 + sum[50%9]
= 5 * 45 + 23
= 248
现在,同样地,查找l-1
项的总和,(因为您必须在l..r
范围内找到总和。
第1(2-1)= 1个术语的总和将是:
(floor)(1/9) * 45 + sum[1 % 9]
= 0 + 5
= 5
所以答案是,248 - 5 = 243。
答案 1 :(得分:0)
你可以通过取两个元素数组9并找到第l个元素来解决这个问题
从第l个项中找到第l个元素的数字和,并分别保存在两个数组中。
W1 = A +(L-1)* d
for(i = 1,j = w1; i&lt; = 9; j + = d,i ++){
if if(j%9 == 0){
array1 [i] = 9;
数组2 [I] = 9;}
否则{
ARRAY1 [I] = j的%9;
数组2 [I] = j的%9;} }
现在q = r-l + 1
w = q / 9和e = q%9
array1 [i] = array1 [i] * w //在循环中从i = 1到9
在array2 [i] = 0 //从i = e + 1到9的新循环 now digitsum + = array1 [i] + array2 [i] //从一个循环i = 1到9,digitum是序列的所有数字的总和
这个数字和是解决方案。