组队赛3-B ,HDU 4961 Boring Sum(数学题)
2017-04-02 22:28
363 查看
kj点击打开链接
其实是求,这一串数中的,每一个数左方为此数倍数的的最大下标对顶的数与右方为此倍数的最小下标对应的数的累加和
其实是求,这一串数中的,每一个数左方为此数倍数的的最大下标对顶的数与右方为此倍数的最小下标对应的数的累加和
#include <iostream> #include <cstring> #include <cstdio> #include<vector> #include<algorithm> using namespace std; #define maxn 100010 vector<int>q[maxn]; int a[maxn]; int t[maxn];//最大下标,保存 int c[maxn]; int b[maxn]; int main() { for(int j=1;j<maxn;j++) for(int i=j;i<maxn;i+=j) q[i].push_back(j);//储存i的各个因子 int n; while(cin >> n && n) { memset(t,0,sizeof(t)); for(int i=1;i<=n;i++)//t[i]对应0~i a[i]倍数的最大下标; { cin>>a[i]; int f; f=t[a[i]]==0?i:t[a[i]];//最大下标 b[i]=a[f]; for(int j=0;j<q[a[i]].size();j++)//遍历a[i]的因子们,他们的最大取值为当前i t[q[a[i]][j]]= i; } memset(t,0x3f,sizeof(t)); for(int i=n;i>=1;i--) { int f; f=t[a[i]]==0x3f3f3f3f?i:t[a[i]]; c[i]=a[f]; for(int j=0;j<q[a[i]].size();j++) t[q[a[i]][j]]=i; } long long ans=0; for(int i=1;i<=n;i++) ans+=(long long)b[i]*c[i]; printf("%lld\n",ans); } return 0; }
相关文章推荐
- hdu 4961 Boring Sum(数学题)
- hdu 4961 Boring Sum(数学题)
- hdu 4961 Boring Sum(2014 Multi-University Training Contest 9)
- HDU 4961 Boring Sum(哈希标记,暴力枚举)
- HDU 4961 Boring Sum(分解因子)
- HDU 4961(杭电多校#9 1002题)Boring Sum(瞎搞)
- HDU 4961 Boring Sum(构造题)
- hdu 4961 Boring Sum(高效)
- hdu 4961 Boring Sum(高效)
- hdu 4961 Boring Sum (思维 哈希 扫描)
- hdu 4961 数学杂题
- hdu4961 Boring Sum(数学)
- hdu 2058 The sum problem(数学题)
- HDU 2058 The sum problem (数学+暴力)
- hdu 3113 Sum of Cubes 数学 枚举 剪枝
- HDU 2058 The sum problem 数学题
- HDU 5776 BestCoder Round #85 sum (数学)
- hdu 2058 The sum problem(数学题)
- HDU-2709 Sumsets 数学题 dp
- HDU 2058 The sum problem [数学]