Description
在天地人三界之中,二次元空间已是家喻户晓。但是,存在于神秘国度的三次元空间却鲜为人知,因为那是只有神知道的世界。
传说中,要进入三次元空间必须通过守门大将的考核。
这是一个很简单的题目。
对于任意一个非负数N,我们定义D(N) 为N上奇数数字的和加上两倍偶数数字的和。举个例子:D(567) = 5 + 6 * 2 + 7 = 24, D(314159) = 3 + 1 + 2 * 4 + 1 + 5 + 9 = 27.
令F(N)表示D(N)的最后一位数字。例如:F(567) = 4, F(314159) = 7。
你的问题是,给你两个数A, B,你要计算出∑F(i), i ∈ [A, B]
对于聪明的你这太简单了,赶紧解决去观摩只有神知道的世界吧~
(出题人Troy)
输入格式
第一行输入一个整数T,表述有T组case。(T <=1000)
接下来T行,每行输入两个数字A, B (0 <= A <= B <= 400,000,000)
输出格式
每一行输出一个整数,表示题目所要求的和。
输入样例
3
1 8
28 138
314159 314159
输出样例
36
495
7
解题思路
规律题
a < n < b 的过程中尾数0到9依次出现时,D(n)就是0到9各一次出现
所以把 [a,b]切分成一个个类似上图的区间就能减少大量运算,剩下两边的残余数另外计算即可
#include<stdio.h>
int calculate(int a, int b);
int get(int n);
int main()
{
int t, a, b;
scanf("%d", &t);
while(t --)
{
scanf("%d %d", &a, &b);
printf("%d\n", calculate(a, b));
}
return 0;
}
int calculate(int a, int b)
{
int l, r, total = 0;
l = a % 10;
r = b % 10;
// 例:[11, 18],[34, 35] 不包括[18, 22]这种情况
if(a - l + 10 > b)
{
while(a <= b)
{
total += get(a);
a ++;
}
}
else
{
total += (b - r - a + l - 10) / 10 * 45;
for(int i = a; i <= a - l + 9; i ++)
total += get(i);
for(int i = b - r; i <= b; i ++)
total += get(i);
}
return total;
}
int get(int n)
{
int total = 0;
while(n)
{
if(n % 10 % 2)
total += n % 10;
else
total += 2 * (n % 10);
n /= 10;
}
return total % 10;
}