首页 > 代码库 > hdu 4961 Boring Sum
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。