hdu 4961 Boring Sum

http://acm.hdu.edu.cn/showproblem.php?pid=4961

先打个表,把每个数的约数存起来,然后从前往后扫一遍,结果存在f[i],然后从后往前扫一遍,结果存在c[i],最后算f[i]*c[i]的和。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <vector>
 4 #include <algorithm>
 5 #define maxn 100001
 6 using namespace std;
 7 
 8 int f[maxn],c[maxn];
 9 vector<int>g[maxn];
10 int vis1[maxn],vis2[maxn];
11 int a[maxn];
12 void inti()
13 {
14     for(int i=2; i<=maxn; i++)
15     {
16         for(int j=i; j<=maxn; j+=i)
17         {
18             g[j].push_back(i);
19         }
20     }
21 }
22 int n;
23 int main()
24 {
25     inti();
26     while(scanf("%d",&n)!=EOF)
27     {
28         memset(vis1,0,sizeof(vis1));
29         memset(vis2,0,sizeof(vis2));
30         memset(f,0,sizeof(f));
31         memset(c,0,sizeof(c));
32         memset(a,0,sizeof(a));
33         if(n==0) break;
34         for(int i=1; i<=n; i++)
35         {
36             scanf("%d",&a[i]);
37         }
38         for(int i=1; i<=n; i++)
39         {
40             if(vis1[a[i]]==0) f[i]=a[i];
41             else f[i]=vis1[a[i]];
42             vis1[1]=a[i];
43             for(int j=0; j<(int)g[a[i]].size(); j++)
44             {
45                 vis1[g[a[i]][j]]=a[i];
46             }
47         }
48         for(int i=n; i>=1; i--)
49         {
50             if(vis2[a[i]]==0) c[i]=a[i];
51             else c[i]=vis2[a[i]];
52             vis2[1]=a[i];
53             for(int j=0; j<(int)g[a[i]].size(); j++)
54             {
55                 vis2[g[a[i]][j]]=a[i];
56             }
57         }
58         __int64 sum=0;
59         for(int i=1; i<=n; i++)
60         {
61             sum+=(__int64)f[i]*(__int64)c[i];
62         }
63         printf("%I64d\n",sum);
64     }
65     return 0;
66 }
View Code

 

posted @ 2014-08-19 18:57  null1019  阅读(254)  评论(0编辑  收藏  举报