组队赛3-B ,HDU 4961 Boring Sum(数学题)

来源:互联网 发布:matlab 矩阵转置 编辑:程序博客网 时间:2024/04/30 20:10

kj点击打开链接

其实是求,这一串数中的,每一个数左方为此数倍数的的最大下标对顶的数与右方为此倍数的最小下标对应的数的累加和


#include <iostream>#include <cstring>#include <cstdio>#include<vector>#include<algorithm>using namespace std;#define maxn 100010vector<int>q[maxn];int a[maxn];int t[maxn];//最大下标,保存int c[maxn];int b[maxn];int main(){    for(int j=1;j<maxn;j++)        for(int i=j;i<maxn;i+=j)        q[i].push_back(j);//储存i的各个因子    int n;    while(cin >> n && n)    {  memset(t,0,sizeof(t));        for(int i=1;i<=n;i++)//t[i]对应0~i  a[i]倍数的最大下标;      {        cin>>a[i];        int f;        f=t[a[i]]==0?i:t[a[i]];//最大下标        b[i]=a[f];        for(int j=0;j<q[a[i]].size();j++)//遍历a[i]的因子们,他们的最大取值为当前i        t[q[a[i]][j]]= i;      }      memset(t,0x3f,sizeof(t));      for(int i=n;i>=1;i--)      {          int f;          f=t[a[i]]==0x3f3f3f3f?i:t[a[i]];          c[i]=a[f];          for(int j=0;j<q[a[i]].size();j++)            t[q[a[i]][j]]=i;      }     long long ans=0;      for(int i=1;i<=n;i++)        ans+=(long long)b[i]*c[i];       printf("%lld\n",ans);    }    return 0;}


0 0
原创粉丝点击