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. [转] HashMap和HashSet的区别

    HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题不涉及到HashSet和H ...

  3. 全局函数VS成员函数

    #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a ...

  4. fackbook的Fresco的多种图片加载方法以及解码过程

    上篇文章中我们提到了图片加载其实是用了三条线程,如果没看过的同学可以先了解下这里. fackbook的Fresco的Image Pipeline以及自身的缓存机制 那么今天我们就来探索一下如何在代码中 ...

  5. CSSの神小结-简单备忘一下(亲测可用)

    css 选择器优先级,标签>id>class 权重 id>class>标签 只记录能想到的以免遗忘: 1.字体css可继承 2.表格:表格细线的合并,表格单元格合并,单元格内容 ...

  6. 解析xml文件

    package com.ss1.xml; import java.io.File; import java.io.FileOutputStream; import java.io.IOExceptio ...

  7. [转]乐死我了,怎么样成为一个全栈程序员(Full Stack Developer),附我想专注的语言

    受苏格拉底大神的启迪,我也来谈谈全栈.禅师:成为全栈工程师,这个问题等于如何成为全才,有可能吗码农:有可能,不过可能性比较低,因为达芬奇这类人毕竟是百年一遇的奇才.不过,因为我热爱这个行业,也有一定天 ...

  8. install chrome in elementary os

    Elementary OS Freya 0.3.2 was officially out for public. As previous release, it comes pre-installed ...

  9. ipseccmd命令解析

    IPSec 首先需要指出的是,IPSec和TCP/IP筛选是不同的东西,大家不要混淆了.TCP/IP筛选的功能十分有限,远不如IPSec灵活和强大.下面就说说如何在命令行下控制IPSec. XP系统用 ...

  10. SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学、字符串、日期时间)函数[转]

    SQL server 创建 修改表格 及表格基本增删改查 及 高级查询 及 (数学.字符串.日期时间)函数   --创建表格 create table aa ( UserName varchar(50 ...