51nod - 1586 - 约数和 - 水题

https://www.51nod.com/Challenge/Problem.html#problemId=1586

一眼看过去居然一点思路都没有的,一言不合就打表,打贡献表。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n = 25;
int a[200];

void update_b(int id) {
    for(int i = 1; i <= id; ++i) {
        if(id % i == 0) {
            a[i]++;
        }
    }
}

void show_c(int id) {
    memset(a, 0, sizeof(a));
    for(int i = 1; i <= id; ++i) {
        if(id % i == 0) {
            update_b(i);
        }
    }
    printf("c[%d]=\n  ", id);
    for(int i = 1; i <= n; ++i) {
        printf("%d%c", a[i], " \n"[i == n]);
    }
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    for(int i = 1; i <= n; ++i) {
        show_c(i);
    }
    return 0;
}

好像a[i]位置对c[j]的贡献就是d(j/i)的样子,所以就预处理出d表就完事了?

数字不大,d表有nlogn的出法。但是暴力分解因子果断T,预处理所有数的因子也是T。原因在于因子是根号级别的,但是正解是直接更新a,是log级别的。

猜你喜欢

转载自www.cnblogs.com/Yinku/p/11273735.html
今日推荐