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. A letter to a good guy in USA

    Hi Nick:Busy recently forgetting to check Yammer in box.Really nice of you to agree to provide help ...

  2. vs2010打包系统必备选择.net framework 3.5sp1编译错误的解决方法

    利用visual studio 2010进行打包程序,默认安装的是Framework 4.0,如果需要将3.5sp1打包到系统中一起安装(选择了"从与我的应用程序相同的位置下载系统必备组件& ...

  3. cookie和session区别

    cookie和session区 session是在服务器端保存用户信息,cookie是在客户端保存用户信息 session保存的是对象,cookie保存的是字符串 session会随回话结束而关闭,c ...

  4. TF255466: Team Foundation Server 的配置过程无法继续。以前的更新或安装需要重

    在验证是否可以安装 SharePoint 时的提示,Error [ System Checks ] TF255466: The configuration process for Team Found ...

  5. js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

    js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...

  6. springmvc+spring+mybatis分页查询实例版本1,ver1.0

    无聊做做看看,几乎没有怎么仔细做过这方面的,总是以为很简单,想想就会,实际做起来结合工作经验感觉还是挺有收获的,可以用在自己的项目上 第一版本思路:框架使用ssm,这个无所谓,采用分页语句查询指定页面 ...

  7. 给uefi引导的方式安装archlinux

    基本就是照着官方的wiki来的,不过官方的wiki的内容太杂了,或许我们需要的是一个瀑布似的流程. 其实大体上与mbr引导的方式类似,只凭借回忆说一下有区别的地方,等下一次有机会的时候再验证一下. 换 ...

  8. SQL的主键和外键约束(转)

    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...

  9. MySQL rename database如何做?

    虽然MySQL里面有rename database的语法,但是只是在5.1.7 to 5.1.23提供的,其他版本并没有,要想做rename操作该如何做呢?percona提供了一个shell #!/b ...

  10. 转载WPF SDK研究 之 AppModel

    Jianqiang's Mobile Dev Blog iOS.Android.WP CnBlogs Home New Post Contact Admin Rss Posts - 528 Artic ...