HDU 4961

来源:互联网 发布:淘宝steam慈善包送大作 编辑:程序博客网 时间:2024/05/20 23:33

WA掉了。。。。。

想法和别人的相反,别人是找因子,我是找倍数。。。。其实感觉没有错啊。。。

这个是错的代码。。。。

#include <stdio.h>#define maxn 200010#define inf 1e18#define ll __int64ll vis[maxn][2];ll a[maxn];ll qian[maxn],hou[maxn];ll big;ll max(ll x,ll y){    if(x>y) return x;    else return y;}void find(ll x,ll loc,ll c[2],ll d[2]){    ll tmp=big/x;    ll i,b;    c[0]=-1;c[1]=inf;    for(i=x+x;i<=big;i+=x)    {        if(vis[i][0])        {        b=vis[i][1];        //printf("**%d\n",i*x);        if(b>c[0]&&b<loc) {c[0]=b;d[0]=i;}        if(b<c[1]&&b>loc) {c[1]=b;d[1]=i;}        }    }    return;}void init(){    ll i,j;    for(i=0;i<2;i++)    for(j=0;j<=maxn;j++)    vis[j][i]=0;}int main(){    ll n;    while(scanf("%I64d",&n)!=EOF&&n)    {        ll c[2],d[2];        ll sum=0;        big=0;        init();        ll i,j,k;        for(i=1;i<=n;i++)        {            scanf("%I64d",&a[i]);            vis[a[i]][0]=1;            vis[a[i]][1]=i;            big=max(big,a[i]);        }        for(i=1;i<=n;i++)        {            if(a[i]==0) {qian[i]=0;hou[i]=0;continue;}            find(a[i],i,c,d);            if(c[0]!=-1) qian[i]=d[0];            else qian[i]=a[i];            if(c[1]!=inf) hou[i]=d[1];            else hou[i]=a[i];            //printf("qian=%d   hou=%d\n",qian[i],hou[i]);            sum+=qian[i]*hou[i];        }        printf("%I64d\n",sum);    }    return 0;}

下午的时候学长来,问了下,说是可能会出现重复的数字,然后就会出错,猛然惊醒。。。又长姿势了。。。自己想的还是太少。

然后按照题解的方法做了,1A,happy。

#include <stdio.h>#include <math.h>#include <string.h>#define maxn 100010#define ll __int64ll a[maxn],b[maxn],c[maxn];ll yinzi[maxn];int main(){    ll n;    while(scanf("%I64d",&n))    {        ll sum=0;        if(n==0) break;        ll i,j;        memset(yinzi,0,sizeof(yinzi));        for(i=1;i<=n;i++)        {            scanf("%I64d",&a[i]);            if(yinzi[a[i]])                b[i]=a[yinzi[a[i]]];            else b[i]=a[i];            for(j=1;j<=sqrt(a[i]);j++)            {                if(a[i]%j==0)                {                    yinzi[j]=i;                    yinzi[a[i]/j]=i;                }            }        }        memset(yinzi,0,sizeof(yinzi));        for(i=n;i>0;i--)        {            if(yinzi[a[i]]) c[i]=a[yinzi[a[i]]];            else c[i]=a[i];            for(j=1;j<=sqrt(a[i]);j++)            {                if(a[i]%j==0)                {                    yinzi[j]=i;                    yinzi[a[i]/j]=i;                    //printf("x=%I64d i=%I64d\n",a[i],j);                 //   printf("yinzi[%I64d]=%I64d  yinzi[%I64d]=%I64d \n",i,yinzi[i],a[i]/j,i);                }            }        }      //  for(i=1;i<=n;i++) printf("b=%I64d   c=%I64d\n",b[i],c[i]);        for(i=1;i<=n;i++) sum+=c[i]*b[i];        printf("%I64d\n",sum);    }    return 0;}


0 0
原创粉丝点击