Boring Sum

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 814 Accepted Submission(s):
390

Problem Description
Number theory is interesting, while this problem is
boring.

Here is the problem. Given an integer sequence a1,
a2, …, an, let S(i) = {j|1<=j<i, and aj
is a multiple of ai}. If S(i) is not empty, let f(i) be the maximum
integer in S(i); otherwise, f(i) = i. Now we define bi as af(i).
Similarly, let T(i) = {j|i<j<=n, and aj is a multiple of
ai}. If T(i) is not empty, let g(i) be the minimum integer in T(i);
otherwise, g(i) = i. Now we define ci as ag(i). The
boring sum of this sequence is defined as b1 * c1 +
b2 * c2 + … + bn * cn.

Given
an integer sequence, your task is to calculate its boring sum.

 
Input
The input contains multiple test cases.

Each
case consists of two lines. The first line contains an integer n
(1<=n<=100000). The second line contains n integers a1,
a2, …, an (1<= ai<=100000).

The
input is terminated by n = 0.

 
Output
Output the answer in a line.
 
Sample Input
5
1 4 2 3 9
0
 
Sample Output
136
 
Hint

In the sample, b1=1, c1=4, b2=4, c2=4, b3=4, c3=2, b4=3, c4=9, b5=9, c5=9, so b1 * c1 + b2 * c2 + … + b5 * c5 = 136.

 
 
题意:

给出n个数的数列a,bi的取值为在1 <= j < i之间如果存在aj % ai == 0,

则取最大下标的值赋给bi,如果不存在,则bi = ai;ci的取值为在i < j <= n之间

如果存在aj % ai == 0,则取最小下标值赋给bi,如果不存在,则ci = ai。

求b1 * c1 + b2 * c2 + ... + bn * cn的和。

思路:

如果直接暴力的话一定会超时,所以我们可以开一个vis数组来记录每一个值

所对应的最大的下标是多少。即每查找ai,分解出ai的质因子,更新vis数组

#include<stdio.h>
#include<string.h>
#define ll __int64
#define maxn 100000+5
#define mem(x) memset(x,0,sizeof(x)) ll a[maxn],b[maxn],c[maxn],sum,n;
ll vis[maxn];//a[i]的下标i int main()
{
ll i,j,k,temp;
while(scanf("%I64d",&n),n)
{
mem(b);
mem(c);
mem(vis);
for(i=;i<=n;i++)
scanf("%I64d",&a[i]);
vis[a[]]=;
for(i=;i<=n;i++)
{
for(j=;j*j<=a[i];j++)
{
if(a[i]%j!=) continue;//取质因子 // printf("i=%I64d j=%I64d a[i]=%I64d ",i,j,a[i]); if(vis[j]!=)//
{
b[vis[j]]=a[i];
// printf("b[vis[j]]=%I64d vis[j]=%I64d ",b[vis[j]],vis[j]);
vis[j]=;
}
temp=a[i]/j;
// printf("temp=%I64d ",temp);
if(vis[temp]!=)//更新
{
b[vis[temp]]=a[i];
// printf("b[vis[temp]]=%I64d vis[temp]=%I64d",b[vis[temp]],vis[temp]);
vis[temp]=;
}
// printf("\n");
}
vis[a[i]]=i;
}
for(i=;i<=n;i++)
if(b[i]==)
b[i]=a[i];
mem(vis);
vis[a[n]]=n; for(i=n-;i>=;i--)
{
for(j=;j*j<=a[i];j++)
{
if(a[i]%j!=) continue;//取质因子
if(vis[j]!=)//
{
c[vis[j]]=a[i];
vis[j]=;
}
temp=a[i]/j;
if(vis[temp]!=)//更新
{
c[vis[temp]]=a[i];
vis[temp]=;
}
}
vis[a[i]]=i;
}
for(i=;i<=n;i++)
if(c[i]==)
c[i]=a[i];
// for(i=1;i<=n;i++)
// printf("b:%I64d\tc:%I64d\n",b[i],c[i]);
sum=;
for(i=;i<=n;i++)
sum+=b[i]*c[i];
printf("%I64d\n",sum);
}
return ;
}
 

Boring Sum(hdu4961)hash的更多相关文章

  1. hdu 4961 Boring Sum(数学题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4961 Problem Description Number theory is interesting ...

  2. PHP内核探索之变量(3)- hash table

    在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量 ...

  3. 哈希(1) hash的基本知识回顾

    好久没看数据结构了,现在也打不起精神来,翻了一下书,严蔚敏那本书.,以下是书的第9章,发现自己很多时候对知识的认识无法结构化和系统化,都是零散的,模糊的混乱的记忆,以后要有体系, 第9章 查找     ...

  4. Redis入门到高可用(七)——Hash

    一.结构 Mapmap结构: filed 不能相同,value可以相同. 二.重要指令 ♦️ HSET  ♦️ HGET  ♦️ HDEL ♦️ Hlen  ♦️ HEXISTS ♦️HGETALL  ...

  5. (面试)Hash表算法十道海量数据处理面试题

    Hash表算法处理海量数据处理面试题 主要针对遇到的海量数据处理问题进行分析,参考互联网上的面试题及相关处理方法,归纳为三种问题 (1)数据量大,内存小情况处理方式(分而治之+Hash映射) (2)判 ...

  6. redis数据类型(三)hash类型

    一.hash类型   hash是一个string类型的field和value的映射表.添加,删除操作都是O(1)(平均).   hash特别适合用于存储对象.相对于将对象的每个字段存成单个string ...

  7. 「LeetCode」0001-Two Sum(Ruby)

    题意与分析 题意直接给出来了:给定一个数,返回数组中和为该数(下为\(x\))的两个数的下标. 这里有一个显然的\(O(n)\)的实现:建立一个hash表,每次读入数(记作\(p\))的时候查询has ...

  8. leetcode 1 Two Sum(查找)

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  9. HDU-1003:Max Sum(优化)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

随机推荐

  1. Dubbo原理实现之使用Javassist字节码结束构建代理对象

    JavassistProxyFactory利用自己吗技术构建代理对象的实现如下: public <T> T getProxy(Invoker<T> invoker, Class ...

  2. mybatis 插件原理

    [传送门]:mybatis 插件原理

  3. javaScript中BOM

    BOM是browser object model的缩写,简称浏览器对象模型 主要处理浏览器窗口(window)和框架(iframe),简述了与浏览器进行交互的方法和接口, 可以对浏览器窗口进行访问和操 ...

  4. java项目配置域名(tomcat直接配置 or 使用nginx反向代理)

    一:  tomcat直接配置域名:https://blog.csdn.net/qq_36330228/article/details/78516160 二: 使用nginx进行反向代理 tomcat服 ...

  5. 微信小程序报Cannot read property 'setData' of undefined的错误

    最近在学习微信小程序的开发,让我吐槽的是,都9102年了,怎么还是有有时不能复制,有时不能打中文的bug呢,这个时候,你可以Ctrl+shift+w一下,如果还不行,那就得重启了.. 进入正题吧,刚在 ...

  6. Twisted 框架 初印象

    上面是twisted官网推荐的书籍,从封面可以看到,是一堆大蟒(python)纠缠在一起,这里可以说明twisted是一个基于pyhton语言,支持各种网络协议(包括UDP,TCP,TLS和其他应用层 ...

  7. 关于使用 IDEA Spring Boot 热部署

    1,POM 中引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  8. WebForm - cookie赋值乱码问题

    cookie的值为中文时候,取cookie的值会出现乱码 解决办法:存取cookie时候先解码和编码 存cookie,进行编码: cookie.Value = HttpUtility.UrlEncod ...

  9. the fist blood of java-eclipse 哈哈哈哈 封装的运用

    class Student {    private int id;    public String name;    public String sex;    private int score ...

  10. copy代码的时候,如何去掉代码前边的编号

    从网页上拷贝下来的代码前面总有编号,如何去掉! 1.使用正则表达式:在editorplus(notepad++)里按ctrl+h,弹出框里勾选上“正则表达式(regular expression)”, ...