记录编号 587510 评测结果 AAAAA
题目名称 平方前缀和 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 1.596 s
提交时间 2024-04-04 00:06:57 内存使用 67.72 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //杜教筛
  4. #define ll long long
  5. const int N = 5e6+10;
  6. const ll mod = 1e9+7,inv6 = 166666668,inv2 = 500000004,m = 5e6;
  7. ll n;
  8. int p[N],cnt;
  9. ll f[N];
  10. bool v[N];
  11. unordered_map<ll,ll>sumf;
  12. void get(){
  13. f[1] = 1;
  14. for(int i = 2;i <= m;i++){
  15. if(!v[i])p[++cnt] = i,f[i] = i - 1;
  16. for(int j = 1;j <= cnt && i <= m / p[j];j++){
  17. v[i*p[j]] = 1;
  18. if(i % p[j] == 0){
  19. f[i*p[j]] = f[i] * (ll)p[j] % mod;break;
  20. }
  21. f[i*p[j]] = f[i] * (ll)(p[j] - 1) % mod;
  22. }
  23. }
  24. for(int i = 1;i <= m;i++)f[i] = (f[i] * (ll)i % mod + f[i-1]) % mod;
  25. }
  26. ll s(ll l,ll r){
  27. return ((l + r) * (r - l + 1ll) / 2ll) % mod;
  28. }
  29. ll S(ll x){
  30. if(x <= m)return f[x];
  31. if(sumf[x])return sumf[x];
  32. ll sum = (((x + 1) * (2ll * x + 1ll)) % (mod * 6) * x / 6) % mod;//??
  33. for(ll l = 2ll,r;l <= x;l = r + 1ll){
  34. r = min(x,x / (x / l));
  35. sum = ((sum - (s(l,r) * S(x / l) % mod)) % mod + mod) % mod;
  36. }
  37. return sumf[x] = sum;
  38. }
  39. int main(){
  40. freopen("squaresum.in","r",stdin);
  41. freopen("squaresum.out","w",stdout);
  42. get();
  43. scanf("%lld",&n);//(φ・id) * id = id ^ 2
  44. printf("%lld\n",S(n));
  45.  
  46. return 0;
  47. }
  48.  
  49.