被三整除

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




方法一:

这里可以用到一个数学课学过的性质。如果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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值