acdream Divide Sum
Divide Sum
Problem Description
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
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的更多相关文章
- Divide Sum 比赛时竟然想不出。。。。。。。
Divide Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...
- ACdream: Sum
Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticN ...
- acdream 1431 Sum vs Product
Sum vs Product Time Limit: 4000/2000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...
- ACdream 1431——Sum vs Product——————【dfs+剪枝】
Sum vs Product Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...
- ACDream - Power Sum
先上题目: Power Sum Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...
- ACDream - Lowbit Sum
先上题目: C - Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...
- hdu 1261 字串数
解题思路:ACM紫书 第十章 P319 有重复元素的全排列 答案: 所有数的和的阶乘 除以 每个数阶乘的乘积 因为给定 (26*12)! 会爆掉(long long),这里用java 的BigInte ...
- [Ramda] Compose and Curry
Curry: The idea of Curry is to spreate the data from the function. Using Curry to define the functio ...
- dax学习
增长率 = (DIVIDE(SUM('业绩达成'[实际业绩]),CALCULATE(SUM('业绩达成'[实际业绩]),PREVIOUSMONTH('业绩达成'[周期])))-1)*100上月业绩 = ...
随机推荐
- 序列变换(hdu5248)
序列变换 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 【Origin】答友朋关切书
发烧感冒脑袋疼, 剃了短毛不威风: 莫再问我有何事, 躺下一觉到天明. --作于二零一五年七月二十七日
- C++之路进阶——bzoj3262(陌上花开)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser gryz2016 Logout 捐赠本站 Notice:由于本OJ ...
- tostring() 作用
tostring() 作用 -->显示类中属性的值 -->不想显示该类的内存地址
- CCF真题之字符串匹配
201409-3 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一 ...
- CCF真题之数字排序
201503-2 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输入格式 输入的第一行包含一个整数n,表示给定数字的个数. 第二行包含n个整数,相邻的整数之间用一 ...
- 夺命雷公狗---微信开发53----网页授权(oauth2.0)获取用户基本信息接口(3)实现世界留言版
前面两节课我们讲的是base型的授权了,那么现在我们开始Userinfo型授权, 先来看下我们的原理图 我们这节课来做一个 世界留言版 系统 1..首先我还是在微信测试平台那里设置好回调页面的域名 2 ...
- 161102、MyBatis中批量插入
方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...
- ServiceStack.Redis常用操作 - 事务、并发锁_转
一.事务 使用IRedisClient执行事务示例: using (IRedisClient RClient = prcm.GetClient()) { RClient.Add("key&q ...
- Linux下创建与解压tar, tar.gz和tar.bz2文件及压缩率对比 | 沉思小屋
刚 在qq群里面一位仁兄问到文件压缩的命令,平时工作中大多用解压缩命令,要是遇到压缩就现查(这不是一个好习惯),于是整理下Linux下创建与解压 zip.tar.tar.gz和tar.bz2文件及他们 ...