给出一个序列A,对于A里面的每个元素,左边最近的能被它整除的元素记为B序列对应位置的,右边最近的是它的整数倍的元素记为C序列对应位置,找不到的记它本身,最后算出对应位置B*C的总和。
容器模拟,按顺序扫一遍,每次如果有符合条件的取出来,即为最近的。最后把它的下标放到对应位置的容器中,然后倒序求一遍,最后求和。
#include#include #include #include #include #include #include #include using namespace std; const int maxn=100010; vector p[maxn]; int n; int a[maxn]; int b[maxn]; int c[maxn]; int main() { while(scanf("%d",&n)!=EOF) { if(n==0) { break; } for(int i=0;i =0;i--) { for(int j=1;j<=sqrt(a[i]);j++) { int u=j; if(a[i]%j==0) { for(int k=0;k