T48568 【zzy】yyy送礼物
生活随笔
收集整理的這篇文章主要介紹了
T48568 【zzy】yyy送礼物
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數論題。。。
來源:luogu秋令營的模擬賽1T2
這道題數據極大,\(N,T \leq 10000000\)。
求的是\(\sum_{i=1}^{n}{n \mod i}\)。
看上去就是余數求和。打那道題的除法分塊做法有70分。
接下來介紹滿分做法:
變成這個式子:
\[\sum_{i=1}^n{\lfloor \frac{n}{i} \rfloor \times i}=\sum_{i=1}^n{d_1(i)}\]
\(d_1(x)\)表示\(x\)的約數和。
這個東西可以用線性篩順便搞出來。
這里粘兩個博客,講得很好,我就不講了。。。
https://blog.csdn.net/controlbear/article/details/77527115
https://blog.csdn.net/wu_tongtong/article/details/79684277
所以可以線性求出這個東西,弄下前綴和。
然后用\(n^2\)減掉這個東西就是答案了。
代碼:
#include<cstdio>#define ll long long const int maxn = 10000005; const int N = maxn - 5; bool notprime[maxn]; int prime[maxn], tot; ll sd[maxn], sp[maxn]; ll pre[maxn]; ll read() {ll ans = 0, s = 1;char ch = getchar();while(ch > '9' || ch < '0'){ if(ch == '-') s = -1; ch = getchar(); }while(ch >= '0' && ch <= '9') ans = (ans << 3) + (ans << 1) + ch - '0', ch = getchar();return s * ans; } void init() {notprime[1] = true; sd[1] = 1; sp[1] = 1;for(int i = 2; i <= N; i++){if(!notprime[i]){prime[++tot] = i;sd[i] = i + 1;sp[i] = i + 1;}for(int j = 1; j <= tot && i * prime[j] <= N; j++){notprime[i * prime[j]] = true;if(i % prime[j] == 0){sd[i * prime[j]] = sd[i] / sp[i] * (sp[i] * prime[j] + 1);sp[i * prime[j]] = sp[i] * prime[j] + 1;break;}else{sd[i * prime[j]] = sd[i] * sd[prime[j]];sp[i * prime[j]] = 1 + prime[j];}}}for(int i = 1; i <= N; i++) pre[i] = pre[i - 1] + sd[i]; } int main() {init();ll T = read();while(T--){ll n = read();printf("%lld\n", n * n - pre[n]);}return 0; }轉載于:https://www.cnblogs.com/Garen-Wang/p/9748916.html
總結
以上是生活随笔為你收集整理的T48568 【zzy】yyy送礼物的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android8强制将app移到sd卡,
- 下一篇: 高校俱乐部发福利啦,晚了就没了,速度~