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], 对于每个1i<n, 他希望你求出一个最小的j(以后用记号F(i)表示),满足i<jn, 使ajai的倍数(即aj mod ai=0),若不存在这样的j,那么此时令F(i) = 0保证1n10000,1ai10000 对于任意 1in, 且对于任意1i,jn(i!=j),满足ai != aj
输入描述
多组数据(最多10组)对于每组数据:第一行:一个数n表示数的个数接下来一行:n个数,依次为a1,a2,,an
输出描述
对于每组数据:输出F(i)之和(对于1i<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
原创粉丝点击