[luogu]P3768 简单的数学题(莫比乌斯反演,杜教筛)

题意

\sum_{i=1}^N \sum_{j=1}^N ijgcd(i,j),答案膜素数p

数据范围:n\leq 10^{10},p\leq 1.1\times 10^{9}

题解

f[d]=\sum \sum ij[gcd(i,j)==d],F[d]=\sum \sum ij[d|gcd(i,j)]

\\ ans=\sum_{i=1}^N df[d]=\sum_{i=1}^N d\sum_{d|x} \mu (\frac{x}{d}) F[x]\\=\sum_{d=1}^N d\sum_{i=1}^{\frac{N}{d}}\mu (i)F[di]=\sum_{j=1}^N F[j] \sum_{x|j} x\mu (\frac{x}{j})

如果所以欧拉函数和狄利克雷卷积,可以知道(\mu * id)(N)=\varphi (N)(我一开始也没反应过来,可以设为(\mu *f)进一步推导)

\\ F[d]=\sum\sum ij[d|gcd(i,j)]=\sum_{i=1}^{\frac{N}{d}} (id) \sum_{j=1}^{\frac{N}{d}} (jd)=d^2 S_1(\frac{N}{d})\quad (S_1(N)=1+2+...+N)

ans=\sum_{j=1}^N S_1(\frac{N}{j}) j^2\varphi(j),S_1可以整除分块求,问题就变为化解j^2\varphi(j)(特指杜教筛操作)

g(x)=x^2,g为积性函数,(j^2\varphi(j) * g)(N) = N^2 \sum_{d|N} \varphi(d)=N^3

由杜教筛

\sum_{i=1}^N i^3 =\sum_{i=1} \sum_{d|i} (d^2\varphi(d) * \frac{i^2}{d^2})=\sum_{i=1} g(x)S_2(\frac{N}{i})\quad (S_2(N)=\sum_{i=1}^N i^2\varphi(i))

那么S_2(N)+\sum_{i=2}^N i^2S_2(\frac{N}{i})=\sum_{i=1}^N i^3

就可以快速求得前缀积了(预处理范围取(10^{10})^{\frac{2}{3}})

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map>
using namespace std;

using LL = long long;
const int MAXN = 8e6 + 5;
LL N, P;
bool noprime[MAXN];
int prime[MAXN], cnt_p, phi[MAXN];
void Euler_Sieve(int top);
LL pre[MAXN];
unordered_map<LL, LL> sum;
LL inv_2, inv_6;
LL getpre(LL);
LL qpow(LL, LL);
LL getsum(LL, int);

int main(){
  cin >> P >> N;
  inv_2 = (P + 1) / 2, inv_6 = qpow(6, P - 2);
  Euler_Sieve(MAXN - 5);
  LL ans = 0;
  LL l, r;
  for(l = 1; l <= N; l = r + 1){
    r = N / (N / l);
    LL tmp = getpre(r) - getpre(l - 1);
    tmp = (tmp % P + P) % P;

    LL x = getsum(N / l, 3);
    tmp = tmp * x % P;

    ans = (ans + tmp) % P;
  }
  cout << ans << endl;
  return 0;
}

LL getpre(LL n){
  if(n <= MAXN - 5) return pre[n] % P;
  if(sum[n]) return sum[n];
  LL l, r, res;
  res = getsum(n, 3);
  for(l = 2; l <= n; l = r + 1){
    r = n / (n / l);
    LL tmp = (getsum(r, 2) - getsum(l - 1, 2) + P) % P;
    res -= getpre(n / l) * tmp % P; res %= P;
  }
  res = (res + P) % P;
  return sum[n] = res;
}

LL qpow(LL x, LL n){
  LL res = 1;
  while(n){
    if(n & 1) res = res * x % P;
    x = x * x % P;
    n >>= 1;
  }
  return res;
}

void Euler_Sieve(int top){
  int i, j;
  phi[1] = 1;
  for(i = 2; i <= top; i++){
    if(!noprime[i])
      prime[++cnt_p] = i, phi[i] = i - 1;
    for(j = 1; j <= cnt_p && prime[j] * i <= top; j++){
      noprime[prime[j] * i] = true;
      if(i % prime[j] == 0){
        phi[prime[j] * i] = phi[i] * prime[j];
        break;
      }
      phi[prime[j] * i] = phi[i] * (prime[j] - 1);
    }
  }

  for(j = 1; j <= top; j++)
    pre[j] = (pre[j - 1] + 1LL * phi[j] * j % P * j % P) % P;
}

LL getsum(LL n, int op){
  n %= P;
  if(op == 1)
    return n * (n + 1) % P * inv_2 % P;
  else if(op == 2)
    return n * (n + 1) % P * (2 * n + 1) % P * inv_6 % P;
  else
    return getsum(n, 1) * getsum(n, 1) % P;
}

 

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值