Divide Sum

Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others)

Problem Description

long long ans = 0;
for(int i = 1; i <= n; i
++)
    for(int j = 1; j <= n; j ++)
        ans += a[i] /
a[j];
给出n,a[1]...a[n],求ans

Input

不超过5组数据,每组数据:

第一行n(1 <= n <= 10^5)

第二行n个数,a[1].. a[n] (1 <= a[i] <= 10^5)

Output

每组数据一行,ans

Sample Input

5
1 2 3 4 5

Sample Output

27

用 n/i = n/(i+k)的方法找上届和下届,统计出现次数,超时。
贴一个代码:
 /*
* this code is made by 987690183
* Problem: 1181
* Verdict: Time Limit Exceeded
* Submission Date: 2014-09-01 12:47:21
* Time: 1000MS
* Memory: 2848KB
*/
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std; int date[];
int num[];
int sum1[];
int main()
{
int n;
int maxn;
while(scanf("%d",&n)>)
{
memset(num,,sizeof(num));
maxn = -;
for(int i=;i<=n;i++) {
scanf("%d",&date[i]);
num[date[i]] ++;
if(date[i]>maxn) maxn = date[i];
}
sum1[]=;
for(int i=;i<=maxn;i++)
sum1[i] = sum1[i-]+num[i]; long long sum = ;
if(n>)
for(int i=;i<=maxn;i++)
{
if(num[i]>)
for(int j=,la = ;j<=i;j = la+)
{
la = i/(i/j);
sum = sum + (long long)(sum1[la]-sum1[j-])*(i/j)*num[i];
}
}
else
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
sum = sum+date[i]/date[j];
}
}
printf("%lld\n",sum);
}
return ;
}

为什么超时,我很疑惑,因为最坏的情况下1-10^5个数字,只出现一次。

时间应该也是n*sqrt(n);

和ac代码比较也是一样吧。超时代码唯一不同的是有许多*,/的运算。

ac代码:只有+

思路:统计数字x的出现次数num[],然后求前n项和用sum1[]保存

然后改变一下思路,求对于第i个数字来说,被多少数字/过,

举例:i = 2,n =9;

那么首先[2-9]里的数字能除i+[8-9]能除i.这有数字8,9就算了两次。

知道统计第i个数字被多少数字/过,就不难理解。

 /*
* this code is made by 987690183
* Problem: 1181
* Verdict: Accepted
* Submission Date: 2014-09-01 14:41:17
* Time: 72MS
* Memory: 2848KB
*/
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<math.h>
using namespace std; int date[];
int num[];
int sum1[];
int main()
{
int n;
int maxn;
while(scanf("%d",&n)>)
{
memset(num,,sizeof(num));
maxn = -;
for(int i=;i<=n;i++) {
scanf("%d",&date[i]);
num[date[i]] ++;
if(date[i]>maxn) maxn = date[i];
}
sum1[]=;
for(int i=;i<=maxn;i++)
sum1[i] = sum1[i-]+num[i]; long long ans = ;
long long sum = ;
for(int i=;i<=maxn;i++)
{
if(num[i])
{
ans = ;
for(int j=i-;j<=maxn;j=j+i)
ans = ans+n-sum1[j]; //!!!!
sum = sum + ans*num[i];
}
}
printf("%lld\n",sum);
}
return ;
}

acdream Divide Sum的更多相关文章

  1. Divide Sum 比赛时竟然想不出。。。。。。。

    Divide Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...

  2. ACdream: Sum

    Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticN ...

  3. acdream 1431 Sum vs Product

    Sum vs Product Time Limit: 4000/2000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...

  4. ACdream 1431——Sum vs Product——————【dfs+剪枝】

    Sum vs Product Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) S ...

  5. ACDream - Power Sum

    先上题目: Power Sum Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...

  6. ACDream - Lowbit Sum

    先上题目: C - Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...

  7. hdu 1261 字串数

    解题思路:ACM紫书 第十章 P319 有重复元素的全排列 答案: 所有数的和的阶乘 除以 每个数阶乘的乘积 因为给定 (26*12)! 会爆掉(long long),这里用java 的BigInte ...

  8. [Ramda] Compose and Curry

    Curry: The idea of Curry is to spreate the data from the function. Using Curry to define the functio ...

  9. dax学习

    增长率 = (DIVIDE(SUM('业绩达成'[实际业绩]),CALCULATE(SUM('业绩达成'[实际业绩]),PREVIOUSMONTH('业绩达成'[周期])))-1)*100上月业绩 = ...

随机推荐

  1. [原创]java WEB学习笔记64:Struts2学习之路--主题

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  3. CCF真题之日期计算

    201509-2 日期计算 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有29天.满足下面条件之一的是闰年: 1) 年份是4的整数倍,而且不是100的整数倍: 2 ...

  4. -XX:+PrintHeapAtGC 每次一次GC后,都打印堆信息

    -XX:+PrintHeapAtGC每次一次GC后,都打印堆信息 {Heap before GC invocations=0 (full 0): def new generation   total ...

  5. 救火必备linux命令

    系统参数: cat /proc/cpuinfo cpu相关参数 cat /proc/meminfo 内存相关参数 cat /proc/loadavg 负载情况 性能参数: )top M:按内存使用排序 ...

  6. ThinkPHP讲解(五)——数据库配置及Model数据模型层、查询

    数据库配置 在TP框架中要进行连接数据库操作,要进行配置 要在convertion.php中找到“数据库配置”,并复制到项目配置文件config.php中 Model模型层制作 model:数据库中每 ...

  7. jQuery讲解

    在讲解jQuery时,要和JavaScript进行对比的讲解,易于理解 JavaScript部分 <title>jquery讲解使用</title> <script sr ...

  8. ralink网卡驱动的下载地址集合

    linuxMT7612U11/7/2014v3.0.0.1http://cdn-cw.mediatek.com/Downloads/linux/MT7612U_DPO_LinuxSTA_3.0.0.1 ...

  9. NOIP200301乒乓球

    NOIP200301乒乓球 [问题背景] 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球 员因为无法适应新规则只能 ...

  10. COM编程概述

    所谓COM,英文为Componet Object Model,中文为组件对象模型(其实这种解释只有在考试卷上才具有一点实际意义). [1]为什么需要COM? COM是为了解决OLE问题而产生的.COM ...