做完本题之后发现和题解求环方法不一样,我是先预处理一个类似前缀积的数组,然后对于每个环可以 O(1) 求出, 这样复杂度感觉就是 n 所有因子的和,求问这大概是个什么复杂度。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int N = 2e5 + 5;
int n, m, a[N], k, sum[N], ans[N];
int gcd(int a, int b){
return b?gcd(b, a%b):a;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
ans[0] += a[i]*a[i];
}
sort(a + 1, a + 1 + n);
for(int i = 2; i <= n; i++){
sum[i] = sum[i - 2] + a[i]*a[i - 2];
}
int now = 0;
ans[n] = ans[0];
for(int i = 1; i <= m; i++){
cin >> k;
if(ans[k]){
cout << ans[k] << "\n";
continue;
}
int w = n/gcd(n, k);
now = 0;
for(int i = 1; i <= n; i += w){
if(w & 1){
now += sum[i + w - 1] - sum[i];
now += sum[i + w - 2] - sum[i + 1];
now += a[i]*(a[i + 1]) + (a[i + w - 2]*(a[i + w - 1]));
}else{
now += sum[i + w - 2] - sum[i];
now += sum[i + w - 1] - sum[i + 1];
now += a[i]*(a[i + 1]) + (a[i + w - 1]*(a[i + w - 2]));
}
}
ans[k] = now;
cout << now << "\n";
}
return 0;
}