2019 ICPC EC Final M(暴力)

90nwyn

2020-10-05 16:39:18

Personal

[题目链接](https://vjudge.net/problem/Gym-102471M) ------------ ------------ ```cpp #include <bits/stdc++.h> using namespace std; const int M=1e6+5; typedef long long ll; ll a[M],b[M]; int vis[M],num[M],tot; ll calc() { ll res=0; for(int i=1;i<(1<<tot);i++) { ll sum=0; for(int j=0;j<tot;j++)if(i&(1<<j)) { sum+=a[num[j+1]]; for(int k=j+j+1;k<tot;k+=j+1)if(i&(1<<k))sum-=b[num[k+1]]; } res=max(res,sum); } return res; } int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); for(int i=1;i<=n;i++)scanf("%lld",&b[i]); ll ans=a[1]; for(int i=2;i<=n;i++)if(!vis[i]) { tot=0; num[++tot]=i; ll t=(ll)i*i; while(t<=n)num[++tot]=t,vis[t]=1,t*=i; ans+=calc(); } printf("%lld\n",ans); return 0; } ```