HDU4961Boring Sum(在线更新方法)
2014-08-20 13:28
141 查看
Boring Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 446 Accepted Submission(s): 227
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 HintIn 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.
Author
SYSU
Source
2014 Multi-University Training Contest 9
题意:给你一个数组,让你生成两个新的数组,A要求每个数如果能在它的前面找个最近的一个是它倍数的数,那就变成那个数,否则是自己,C是往后找,最后每对应的b,c相乘之和。
#include<stdio.h> #include<string.h> __int64 fact[100005][129],k[100005]; void setprim() { memset(k,0,sizeof(k)); for(__int64 i=1;i<=100000;i++) { for(__int64 j=i;j<=100000;j+=i) { fact[j][++k[j]]=i; } } } __int64 a[100005],b[100005],c[100005],index[100005]; int main() { setprim(); __int64 i,j,sum,n; while(scanf("%I64d",&n)>0&&n) { for( i=1;i<=n;i++) scanf("%I64d",&a[i]); memset(index,0,sizeof(index)); for(i=1;i<=n;i++) { if(index[a[i]])b[i]=a[index[a[i]]]; else b[i]=a[i]; for(j=1;j<=k[a[i]];j++) index[fact[a[i]][j]]=i; } sum=0; memset(index,0,sizeof(index)); for(i=n;i>=1;i--) { if(index[a[i]])c[i]=a[index[a[i]]]; else c[i]=a[i]; for(j=1;j<=k[a[i]];j++) index[fact[a[i]][j]]=i; } for( i=1;i<=n;i++) sum+=b[i]*c[i]; printf("%I64d\n",sum); } }
相关文章推荐
- C#抽象工厂模式的几种实现方法及比较开发者在线 Builder.com.cn 更新时间:2008-07-19作者: 来源:
- ASP.NET常用的26个优化性能方法开发者在线 Builder.com.cn 更新时间:2008-07-22
- Android在线更新SDK的方法(使用国内镜像)
- 用ASP.NET解决用户意外退出在线列表无法及时更新问题的方法
- Android SDK在线更新方法
- eclipse中更新android SDK的方法(在线更新)
- Android ADT 无法在线安装,离线下载ADT压缩包方法。SDK Manager无法更新
- Android在线更新SDK的方法(使用国内镜像)
- sdk在线下载更新方法(2015亲测有效)
- Android studio 无法在线更新的解决方法
- eclipse中更新android SDK的方法(在线更新)
- C# 3.0中的分部方法开发者在线 Builder.com.cn 更新时间:2008-07-19作者: 来源:
- Android Studio V1.0快速安装,避免在线更新SDK的方法
- adobe CC 2015 mac 版本全套破解方法(可在线更新或者离线更新)
- yum在线更新出现This system is not registered with RHN等错误解决方法
- Android在线更新SDK的方法(使用国内镜像)
- Android SDK Manager 在线更新时出现Time Out 解决方法
- 【Remoting】.Net remoting方法实现简单的在线升级(上篇:更新文件)
- 理解C# 3.0新特性之Extension方法浅议开发者在线 Builder.com.cn 更新时间:2008-07-19作者: 来源:
- Android环境搭建——adt无法更新或者无法在线安装的解决方法