标签:des style blog color java io strong for ar
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 814 Accepted Submission(s):
390
给出n个数的数列a,bi的取值为在1 <= j < i之间如果存在aj % ai == 0,
则取最大下标的值赋给bi,如果不存在,则bi = ai;ci的取值为在i < j <= n之间
如果存在aj % ai == 0,则取最小下标值赋给bi,如果不存在,则ci = ai。
求b1 * c1 + b2 * c2 + ... + bn * cn的和。
思路:
如果直接暴力的话一定会超时,所以我们可以开一个vis数组来记录每一个值
所对应的最大的下标是多少。即每查找ai,分解出ai的质因子,更新vis数组
#include<stdio.h> #include<string.h> #define ll __int64 #define maxn 100000+5 #define mem(x) memset(x,0,sizeof(x)) ll a[maxn],b[maxn],c[maxn],sum,n; ll vis[maxn];//a[i]的下标i int main() { ll i,j,k,temp; while(scanf("%I64d",&n),n) { mem(b); mem(c); mem(vis); for(i=1;i<=n;i++) scanf("%I64d",&a[i]); vis[a[1]]=1; for(i=2;i<=n;i++) { for(j=1;j*j<=a[i];j++) { if(a[i]%j!=0) continue;//取质因子 // printf("i=%I64d j=%I64d a[i]=%I64d ",i,j,a[i]); if(vis[j]!=0)// { b[vis[j]]=a[i]; // printf("b[vis[j]]=%I64d vis[j]=%I64d ",b[vis[j]],vis[j]); vis[j]=0; } temp=a[i]/j; // printf("temp=%I64d ",temp); if(vis[temp]!=0)//更新 { b[vis[temp]]=a[i]; // printf("b[vis[temp]]=%I64d vis[temp]=%I64d",b[vis[temp]],vis[temp]); vis[temp]=0; } // printf("\n"); } vis[a[i]]=i; } for(i=1;i<=n;i++) if(b[i]==0) b[i]=a[i]; mem(vis); vis[a[n]]=n; for(i=n-1;i>=1;i--) { for(j=1;j*j<=a[i];j++) { if(a[i]%j!=0) continue;//取质因子 if(vis[j]!=0)// { c[vis[j]]=a[i]; vis[j]=0; } temp=a[i]/j; if(vis[temp]!=0)//更新 { c[vis[temp]]=a[i]; vis[temp]=0; } } vis[a[i]]=i; } for(i=1;i<=n;i++) if(c[i]==0) c[i]=a[i]; // for(i=1;i<=n;i++) // printf("b:%I64d\tc:%I64d\n",b[i],c[i]); sum=0; for(i=1;i<=n;i++) sum+=b[i]*c[i]; printf("%I64d\n",sum); } return 0; }
标签:des style blog color java io strong for ar
原文地址:http://www.cnblogs.com/yuyixingkong/p/3930859.html