(打表+优化)简单的求和 -- zzuli -- 1783

http://acm.zzuli.edu.cn/problem.php?id=1783

1783: 简单的求和

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 170  Solved: 31

SubmitStatusWeb Board

Description

定义f(i)代表i的所有因子和(包括1和i),给定一个l,r。求f(l)+f(l+1)+...+f(r)。

Input

第一行输入一个t(t<1000),代表有t组测试数据,接下来每行输入两个数字l,r,(1<=l<=r<=1000000)。

Output

每行输出一个整数,代表和。

Sample Input

2

1 2

3 4

Sample Output

4

11

感觉这道题的表打的很巧妙, 很好的降低了时间复杂度, 表示膜拜, 反正要我想我是想不到的

#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

const int N=1e6+10;
const int INF=0x3f3f3f3f;
const int MOD=2008;

typedef long long LL;

LL sum[N];

void Solve()
{
    int i, j;

    sum[0] = 0; sum[1] = 1;

    for (i = 2; i <= 1000000; i++) ///首先我们肯定要先将1和本身存下来(毕竟我们不会遍历到n哒,会超时)
        sum[i] = i+1;

    for (i = 2; i*i <= 1000000; i++) ///这个循环是打表的关键,首先我们统计的是因子和,那么不超过sqrt(n)就可以了(这里不这样写不仅会超时,根本没法测试。。。。)
    {
        for (j = i+1; i*j <= 1000000; j++)
            sum[i*j] += i+j; ///i是其中一个因子,那么j就是i对应的另一个因子(i*j==n)

        sum[i*i] += i; ///这种情况是i==j的情况,那么只能加上一个i
    }

    for (i = 2; i <= 1000000; i++) ///最后将所有的和统计下来,这样当我们要求一个区间的和时可以直接减
        sum[i] = sum[i-1]+sum[i];
}

int main ()
{
    int T, l, r;

    Solve();

    scanf("%d", &T);

    while (T--)
    {
        scanf("%d%d", &l, &r);
        printf("%lld\n", sum[r]-sum[l-1]);
    }

    return 0;
}
时间: 2024-08-10 00:07:25

(打表+优化)简单的求和 -- zzuli -- 1783的相关文章

简单的求和(打表)

简单的求和 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 130  Solved: 20SubmitStatusWeb Board Description 定义f(i)代表i的所有因子和(包括1和i),给定一个l,r.求f(l)+f(l+1)+...+f(r). Input 第一行输入一个t(t<1000),代表有t组测试数据,接下来每行输入两个数字l,r,(1<=l<=r<=1000000). Output 每行输出一个整数,代表

zzuli1783: 简单的求和---求因子和

1783: 简单的求和 Description 定义f(i)代表i的所有因子和(包括1和i),给定一个l,r.求f(l)+f(l+1)+...+f(r). Input 第一行输入一个t(t<1000),代表有t组测试数据,接下来每行输入两个数字l,r,(1<=l<=r<=1000000). Output 每行输出一个整数,代表和. Sample Input 2 1 2 3 4 Sample Output 4 11 #include <iostream> #include

详解MySQL大表优化方案

当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用TINYINT.SMALLINT.MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED VARCHAR的

针对MySQL大表优化方案

详解MySQL大表优化方案 (1).字段 (2).索引 (3).规范查询SQL (4).存储引擎 (5).mysql配置参数优化 (6).mysql读写分离 (7).分区和分表 单表优化: 当单表的数据不是一直在暴增,不建议使用拆分,拆分会带来逻辑,部署,运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量 (1).字段 l 尽量使用TINYINT.SMALLINT

C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. 1 #pragma once 2 #include<iostream> 3 #include<string> 4 #include<stdlib.h> 5 using namespace std; 6 7 template <class T> 8 class Vector 9 { 10 publ

MySQL 大表优化方案探讨

当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用TINYINT.SMALLINT.MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED VARCHAR的

哈希表的简单实现

下面这个散列表的实现来自K&R,很经典.在其他场景中遇到的实现更复杂,基本原理不变,只是在hash算法,或者在快速查询上做了优化. #include <stdio.h> #include <stdlib.h> //具有相同hash值构成的链表 struct nlist{ struct nlist * next; char * name;  //key-定义的名字 char * defn;  //value-替换文本 }; #define HASHSIZE 101  //桶的

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头

MySQL大表优化方案

当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在 千万级 以下,字符串为主的表在 五百万 以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用 TINYINT . SMALLINT . MEDIUM_INT 作为整数类型而非 INT ,如果非负则加上 UNSI