洛谷秋季集训测试1

这次真的是很凉了
T1玄学炸 T2爆胎翻车 T3…正解行数500+

T1

求问一个集合各子集元素和的和
集合大小n <= 1e6

分析每个元素贡献
ans = (sum_{i=1}^{n} i) * 2^{n - 1}

T2

给定T个n,求每个n的 sum_{i = 1}^{n} n mod i
n <= 1e7 T <= 1e6

明显离线
sum_{i = 1}^{n} n mod i
= n^2 - sum_{i = 1}^{n} (n / i) * i; 考虑每一个数的贡献得
= n^2 - sum_{i=1}^{n} d_1(i)
然后就是线性筛

复习一下 约束和的计算方式是

inline void calc(){
    d1[1] = sp[1] = npr[1] = 1;
    for(int i = 2; i <= N; ++i){//i <= N
        if(!npr[i]) prm[++ps] = i, d1[i] = sp[i] = 1ll * i + 1ll;
        for(int j = 1, x; j <= ps && prm[j] * i <= N; ++j){
        	npr[x = i * prm[j]] = 1;
            if(i % prm[j]) d1[x] = d1[i] * d1[prm[j]], sp[x] = prm[j] + 1;//sp[x] != ps[i]!!!
        	else {
        		sp[x] = sp[i] * prm[j] + 1, d1[x] = d1[i] / sp[i] * sp[x]; 
        		break;
        	}
        }
    }
}

T3

欸。。。
题目链接:yyy的迷失
想到要线段树 想到要倍增 然而把他们当成两种完全不同的想法。。
大概就是先扫描线求出每个箭头上点的必走路径
然后把这路径倍增
繁琐在于要扫四次

原文地址:https://www.cnblogs.com/hjmmm/p/9745534.html