题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5211
Mutiple
解题思路:
从右向左查看序列 维护一个数组 p[1..10000] 表示该数上一次出现的位置 遇到一个数就暴力查看它的所有倍数,取最小值即可 时间复杂度为 O(n/1+n/2+…+n/n)=O(nlogn)
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
int a[10010];
while(scanf("%d",&n)!=EOF)
{
int i,j,ans=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[j]%a[i]==0)
{
ans+=j;
break;
}
printf("%d\n",ans);
}
return 0;
}