2141: 2333

题目描述

“别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“ 宝儿姐考察你一道很简单的题目。给你一个数字串,你能判断有多少个连续子串能整除3吗?

输入

多实例输入,以EOF结尾,每行一个数字串(长度<=1e6)

输出

每行一个数字串,表示能整除3的连续子串的个数

样例输入

       (随机敲了一组样例,发现了新的bug)

样例输出

大致思路:

  根据题意可知,时间复杂度只够跑单重循环,多重循环就炸了!

  求一次前缀和,存进dp数组!然后对3取余,分别求出0/1/2的个数为sum0和sum1和sum2;

  由面向(第三组)样例编程原理可知,其前缀和数组%3取余后的结果dp=“ 121 110 20 ”,sum0=2,sum1为4,sum2为2;

  每个前缀和%3为0,最终结果ans+=sum0,然后每两个o对应的下标i和j之间那段的和也是0(因为0-0=0),故ans+=(sum*(sum-1)/2);

  然后每两个1对应的下标i和j之间那段的和也是1(因为1-1=0),故ans+=(sum1*(sum1-1)/2);——这个式子也就是组合式:C(n=sum1,m=2);

  然后每两个2对应的下标i和j之间那段的和也是0(因为2-2=0),故ans+=(sum2*(sum2-1)/2);

数学推理:

  求出前缀和数组为sum,sumi-sumj表示i--j的数组和;

  若(sumi-sumj)%3==0, 推得sumi%3 -sumj%3==0; 枚举可知sumi和sumj同为0,1,2即可!

  遍历一遍对3取余后的sum数组即可得到0,1,2的个数为sum0和sum1和sum2!  

ans=sum0*(sum0-1)/2+sum1*(sum1-1)/2+sum2*(sum2-1)/2+sum0;

面向样例编出来的代码:

 #include <iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<math.h>
#include<map>
#include<set>
#define ll long long
using namespace std;
#define N 1000008
#define lson rt<<1
#define rson rt<<1|1 char s[N];
int a[N];
ll dp[N];
int main(){
s[]='';
while(scanf("%s",s+)!=EOF){
int len=strlen(s);
memset(dp,,sizeof(dp)); for(int i=;i<len;i++){
a[i]=s[i]-'';
dp[i]=(a[i]+dp[i-])%;
}
ll sum0=,sum1=,sum2=,ans=;
for(int i=;i<len;i++){
if(dp[i]==)
sum0++;
else if(dp[i]==)
sum1++;
else
sum2++;
}
ans=sum0*(sum0-)/+sum1*(sum1-)/+sum2*(sum2-)/+sum0; printf("%lld\n",ans);
} return ;
}

(严格的数据会超int的数据范围,故用longlong)

ZZNU-oj-2141:2333--【O(N)求一个数字串能整除3的连续子串的个数,前缀和数组+对3取余组合数找规律】的更多相关文章

  1. Python求一个数字列表的元素总和

    Python求一个数字列表的元素总和.练手: 第一种方法,直接sum(list): 1 lst = list(range(1,11)) #创建一个1-10的数字列表 2 total = 0 #初始化总 ...

  2. Codeforces Round #189 (Div. 2) A. Magic Numbers【正难则反/给出一个数字串判断是否只由1,14和144组成】

    A. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

    package com.lw.HomeWork1;//包名 2 import java.util.Scanner; public class Demo18 { /** * @param args */ ...

  4. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。

    import java.util.Scanner; /** * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字. * 2+22+222+2222+22222(此时共有5个数 ...

  5. 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。

    一.第一种写法 package com.pb.demo1; import java.util.Scanner; /** * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字. ...

  6. 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。

    题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解法一:暴力求解.从1开始查找M,然后判断M*N=X这个数字是否只含有0,1. 解法二:由 ...

  7. 写一个方法完成如下功能,判断从文本框textbox1输入的一个字符,如果是数字则求该数字的阶乘,如果是小写字条,则转换为大写,大写字符不变,结果在文本框textbox2中显示

    窗体设计: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  8. 求一个int型整数的两种递减数之和(java)--2015华为机试题

    题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的 ...

  9. 输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数

    题目: 输入一个数字n  如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数  写出一个函数 首先,这道题肯定可以用动态规划来解, n为整数时,n的解为 n/2 的解加1 n为奇数时 ...

随机推荐

  1. 解决移动端1px的问题,设备像素比devicePixelRatio的应用

    本文主要针对移动端1物理像素问题展开 解决这个问题先要了解一下概念: CSS像素(CSS Pixel):(通俗说:样式中写的值)就是我们在样式代码中常写的逻辑像素,是一个抽象概念,实际并不存在 设备独 ...

  2. DDS工作原理及其性能分析

    DDS工作原理及其性能分析 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 系列博客说明:此系列博客属于作者在大三大四阶段所储备的关于电子电路设计等硬件方面的 ...

  3. mysql数据恢复,binlog详解

    个人博客:mysql数据恢复,binlog详解 binlog日志恢复数据,是挽救错误操作和数据损坏一根救命稻草,所以认识和使用binglog对于技术人员还是很有必要的 binlog一般用于 主从复制 ...

  4. “无法改变的设计”——浅谈Java中的final关键字

    在Java中,final关键字可以用来修饰类.变量(包括成员变量和局部变量).方法,下面从这三个方面分别说明. final方法 当一个方法被final修饰时,表明这个方法不能被子类重写. 下面程序试图 ...

  5. Spring Boot系列教程十一: Mybatis使用分页插件PageHelper

    一.前言 上篇博客中介绍了spring boot集成mybatis的方法,基于上篇文章这里主要介绍如何使用分页插件PageHelper.在MyBatis中提供了拦截器接口,我们可以使用PageHelp ...

  6. python学习-18 元组

    tuple 1.元组tuple类似列表,由小括号()括住,其中的元素不可被修改,不能被增加或删除. tu = (222,222123123,("小胡子",444),12341,&q ...

  7. python爬虫框架scrapy 豆瓣实战

    Scrapy 官方介绍是 An open source and collaborative framework for extracting the data you need from websit ...

  8. 数据库SQL语句大全——最常用的SQL语句

    检索数据: 检索单个列: SELECT pname FROM product 检索多个列: SELECT pname,market_price,is_hot FROM product 检索所有列: S ...

  9. Qt中的常用容器类(解释比较全面,有插图)

    在Qt库中为我们提供了一系列的基于模板的容器类.这些类可以被用来存储特定类型的项.例如,如果你需要一个大小可以变得QString数组,那么可以使用QVector<QString>. 这些容 ...

  10. Session共享问题---理论

    随着网站访问量增加,初期的一台服务器已经完全不能支持业务,这个时候我们就需要增加服务器设备,来抗住请求的增量,如下所示: 负载均衡的目的本来就是要为了平均分配请求,所以没有固定第一次访问和第二次访问的 ...