hdu5211Mutiple
来源:互联网 发布:pubmed数据库电脑官网 编辑:程序博客网 时间:2024/06/05 12:42
Mutiple
Accepts: 476
Submissions: 1025
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
wld有一个序列a[1..n] , 对于每个1≤i<n , 他希望你求出一个最小的j (以后用记号F(i) 表示),满足i<j≤n , 使aj 为ai 的倍数(即aj modai =0),若不存在这样的j ,那么此时令F(i) = 0保证1≤n≤10000,1≤ai≤10000 对于任意1≤i≤n , 且对于任意1≤i,j≤n(i!=j) ,满足ai !=aj
输入描述
多组数据(最多10 组)对于每组数据:第一行:一个数n 表示数的个数接下来一行:n 个数,依次为a1,a2,…,an
输出描述
对于每组数据:输出F(i) 之和(对于1≤i<n )
输入样例
41 3 2 4
输出样例
6
Hint
F(1)=2F(2)=0F(3)=4F(4)=0
从右向左查看序列维护一个数组p[1..10000] 表示该数上一次出现的位置遇到一个数就暴力查看它的所有倍数,取最小值即可时间复杂度为O(n/1+n/2+…+n/n)=O(nlogn)
#include <iostream>#include <string.h>using namespace std;int a[10010],b[10010];int n,tmp;int main(){while(cin>>n){memset(b,0,sizeof(b));long long ans=0;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=n;i>=1;i--){b[a[i]]=i;tmp=10001;for(int j=2;j*a[i]<=10000;j++){if(b[j*a[i]]!=0&&b[j*a[i]]<tmp)tmp=b[j*a[i]];}if(tmp!=10001) ans+=tmp;}cout<<ans<<endl;}return 0;}最近做题感觉好多都是从后往前搞的【 !!
0 0
- hdu5211Mutiple
- HDU5211Mutiple
- hdu5211Mutiple+数论
- 2014下半年部分Html5小游戏记录
- 2015中国数据库大会Mongodb分享
- Android中onInterceptTouchEvent与onTouchEvent(图文)!
- C Primer Plus 第七章 课后练习……2015.4.26
- AAA java实现文件的复制,移动
- hdu5211Mutiple
- 最简单的小型商城实现:Serlvet+Jsp经典案例
- VC实现文件自我删除
- 习题3-17
- 如何远程控制另一台计算机并传送文件
- 黑马程序员—Properties—限制与记录程序运行次数
- 单例模式
- MySQL窗口输入密码后消失,解决办法
- vistual studio 2012 在本地安装 msdn2013