WA掉了。。。。。
想法和别人的相反,别人是找因子,我是找倍数。。。。其实感觉没有错啊。。。
这个是错的代码。。。。
#include <stdio.h>
#define maxn 200010
#define inf 1e18
#define ll __int64
ll 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 __int64
ll 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;
}