这个题暂时可以归为数学归纳法


方法一:
这里可以用到一个数学课学过的性质。如果a+b+c的值可以被3整除。那么abc组成的数也能够被3整除。
#include<stdio.h>
#define maxlen 1007
char road[maxlen];
int main() {
int t, i;
scanf("%d", &t);
for (i = 0; i < t; ++i) {
int len, count = 0;
scanf("%d", &len);
scanf("%s", road);
char *p;
for (p = road; p < road + len; ++p) {
if (*p == '.') {
p[1] = p[2] = 'X';
count++;
}
}
printf("%d\n", count);
}
return 0;方法二:
写出来当插入i以后的规律:
i = 1 ----> 1
i = 2 ----> 0
i = 3 ----> 0
i = 4 ----> 1
i = 5 ----> 0
i = 6 ----> 0
i = 7 ----> 1
………………
发现在区间[1,x]之间共计有 fuck(x) = (x+2)/3 个1,剩下的都满足要求
那么在区间[l, r]上的 r-l+1个 数字中,必须抠掉 fuck(r) - fuck(l-1) 个不满足要求的数字。
直接打印出来就可以了,O(1),不需要循环遍历。
#include<stdio.h>
#define fuck(x) (((x)+2)/3)
int main(){
int l, r;
while(~scanf("%d%d", &l, &r))
printf("%d\n", r-l+1-fuck(r)+fuck(l-1));
return 0;
}
3795

被折叠的 条评论
为什么被折叠?



