LightOJ 1136 Division by 3 (想法题)

http://www.lightoj.com/volume_showproblem.php?problem=1136


开始打算解二次同余的,算了一会发现有很多解。。-->转而分析序列结构。

分析发现:

连续三个整数并排在一起组成的数的数字和必然能被3整除。(x+x+1+x+2=3x+3=3(x+1))

从而有:

1.题目中的第3k个数,必然能被三整除。

2. 题目中的第3k + 1个数,其第2个数字到最末一个数字之和必然能被3整除,再加上第一个数字,也就是1,就不能被3整除了。

3. 题目中的第3k + 2个数,其第3个数字到最末一个数字之和必然能被3整除,再加上第一、二个数字,也就是1 + 2 = 3,也能被3整除。

所以1~k中能被3整除的有2k/3+(k%3==2?1:0)个


完整代码:

/*0.008s,1088KB*/

#include<cstdio>
typedef unsigned int ll;

ll calc(ll k)
{
	return k / 3 * 2 + (k % 3 == 2 ? 1 : 0);
}

int main()
{
	int t, cas = 0;
	ll a, b;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%u%u", &a, &b);
		printf("Case %d: %u\n", ++cas, calc(b) - calc(a - 1));
	}
	return 0;
}

你可能感兴趣的:(C++,ACM,lightoj)