牛客練習賽 因數個數和 分塊或容斥

2021-08-28 00:09:00 字數 752 閱讀 8465

1.分塊

時間複雜度為o(

依次計算每個塊的貢獻1 ->r1,l2 -> r2, l3 -> r3, l4 -> r4, ......, ln -> rn

舉例:計算10的因數的個數:

第一塊:1到1,每個數的貢獻為10, 總貢獻為:10*(1-1+1)

第二塊:2到2,每個數的貢獻為5, 總貢獻為:5*(2-2+1)

第三塊:3到3,每個數的貢獻為3, 總貢獻為:3*(3-3+1)

第四塊:4到5,每個數的貢獻為2, 總貢獻為:2*(5-4+1)

第五塊:6到10,每個數的貢獻為1, 總貢獻為:1*(10-6+1)

即總的因數個數為:10*(1-1+1) + 5*(2-2+1) + 3*(3-3+1) + 2*(5-4+1) + 1*(10-6+1) = 27

#includeusing namespace std;

typedef long long ll;

int main()

printf("%lld\n", ans);}}

2.容斥

#includeusing namespace std;

typedef long long ll;

int main()

ans = ans * 2 - nu * nu;

printf("%lld\n", ans);

}return 0;

}

牛客練習賽25 因數個數和

大佬的部落格寫的很清楚 求1 n的因子個數和 就是從1 n中qu的數任意取乙個數i 在1 n之間有多少是i的倍數 即 n i 因為n i的結果也是 n的因數 所以可以只算 1 sqrt n 然後乘 2 因為n i可以等於i,乘2重複計算了,還要減去這些重複計算的數 只要 i的平方小於等於n 都算重複...

牛客練習賽25 A 因數個數和 數論分塊

題意 q次詢問,每次給乙個x,問1到x的因數個數的和。1 q 10 1 x 10 9 1s思路 對1 n中的每個數i,i作為i,2i,3i,的約數,一共作為n i個數的約數 於是題目就轉化為求 displaystyle sum n lfloor frac rfloor 數論分塊 o displays...

牛客練習賽25 因數個數和(貢獻法)

題意 q次詢問,每次給乙個x,問1到x的因數個數的和。思路 考慮1到x的數的因子為1有x 1,因子為2有x 2,所以要求的就是 從ans式子可以看出,12 5和12 6都是2,12 7和12 8和 12 12都是1,對應的區間為 5,6 7,12 這些區間的l和r是可以算出來的,令i從1開始,r x...