求助关于时间复杂度
查看原帖
求助关于时间复杂度
265453
strange757楼主2022/10/13 10:11

做完本题之后发现和题解求环方法不一样,我是先预处理一个类似前缀积的数组,然后对于每个环可以 O(1)O(1) 求出, 这样复杂度感觉就是 nn 所有因子的和,求问这大概是个什么复杂度。

#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;
}
2022/10/13 10:11
加载中...