题面

传送门

题解

这题有毒……不知为啥的错误调了半天……

令\(f(i)={sgcd(i)}\),那么容易看出\(f(i)\)就是\(i\)的次大质因子,用\(i\)除以它的最小质因子即可计算

于是题目所求即为

\[\sum_{i=1}^n\sum_{j=1}^n{f(\gcd(i,j))}^k
\]

\[\sum_{d=1}^n {f(d)}^k\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{n}{d}\right\rfloor}[\gcd(i,j)=1]
\]

\[\sum_{d=1}^n {f(d)}^k(2\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\varphi(i)-1)
\]

后面那个根据\(\varphi\)的定义就可以推出来

因为后面括号中的式子只与\({\left\lfloor\frac{n}{d}\right\rfloor}\)的值有关,我们可以考虑整除分块,那么括号里的东西就是一个杜教筛

那么我们现在的问题就是对于前半部分怎么快速求和了。我们考虑\(Min\_25\)筛的过程,其中\(g(n,j)\)表示所有\(1\)到\(n\)中的质数或最小质因子大于\(P_j\)的所有数的\(k\)次方之和,即

\[g(n,j)=\sum_{i=1}^ni^k[i\in P\ or\ min_p(i)>P_j]
\]

中间的转移中有这么一步

\[g(n,i)=g(n,j-1)-{P_j}^k(g({\left\lfloor\frac{n}{P_j}\right\rfloor},j-1)-\sum_{i=1}^{j-1}{P_i}^k)
\]

考虑后面减去的东西,是所有最小质因子等于\(P_j\)且自身为合数的数的\(k\)次方之和,即

\[\sum_xx^k[x\notin P\ and\ min_p(x)=P_j]
\]

然后我们惊喜地发现,后面减去的东西中,括号里的东西就是上面所有满足条件的\(x\)的\({f(x)}^k\)之和!

那么我们就可以直接\(Min\_25\)筛来计算\({f(x)}^k\)的前缀和了,那么一段区间只要差分一下就可以了

最后有个尴尬的问题,就是这个模数不是质数,所以我们在初始化的时候需要快速计算\(\sum_{i=1}^n i^k\)就不能拉格朗日插值了

那么只好用第二类斯特林数优化了

\[\begin{aligned}
\sum\limits_{i=1}^{n}i^K&=\sum_{i=1}^n\sum_{j=1}^K\begin{Bmatrix}K\\j\end{Bmatrix}i^\underline{j}\\
&=\sum_{j=1}^K\begin{Bmatrix}K\\j\end{Bmatrix}\sum_{i=1}^ni^\underline{j}\\
&=\sum_{j=1}^K\begin{Bmatrix}K\\j\end{Bmatrix}\frac{{(n+1)}^\underline{j+1}}{j+1}
\end{aligned}\]

然后没有然后了

//minamoto
#include<bits/stdc++.h>
#define R register
#define int unsigned int
#define IT map<int,int>::iterator
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=1e5+5;
int w[N<<1],g[N<<1],h[N<<1],G[N<<1],id1[N],id2[N],p[N],pw[N],sp[N],phi[N],S[55][55];
map<int,int>mp;bitset<N>vis;int n,m,k,tot,sqr,id,ans,now,las;
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x*=x)if(y&1)res*=x;
return res;
}
void init(int n){
phi[1]=1;
fp(i,2,n){
if(!vis[i])p[++tot]=i,pw[tot]=ksm(i,k),sp[tot]=sp[tot-1]+pw[tot],phi[i]=i-1;
for(R int j=1;j<=tot&&1ll*i*p[j]<=n;++j){
vis[i*p[j]]=1;
if(i%p[j]==0){phi[i*p[j]]=phi[i]*p[j];break;}
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
fp(i,1,n)phi[i]+=phi[i-1];
S[0][0]=1;
fp(i,1,k){
S[i][1]=1;
fp(j,2,i)S[i][j]=S[i-1][j]*j+S[i-1][j-1];
}
}
int Phi(int n){
if(n<=sqr)return phi[n];
IT it=mp.find(n);
if(it!=mp.end())return it->second;
int res=n*(n+1)>>1;
for(R int i=2,j;i<=n;i=j+1)
j=n/(n/i),res-=Phi(n/i)*(j-i+1);
return mp[n]=res;
}
int calc(int n){
int res=0,tmp;
fp(i,1,min(k,n)){
tmp=S[k][i];
fp(j,n-i+1,n+1)(j%(i+1)==0)?tmp*=j/(i+1):tmp*=j;
res+=tmp;
}return res;
}
signed main(){
// freopen("testdata.in","r",stdin);
scanf("%u%u",&n,&k),init(sqr=sqrt(n));
for(R int i=1,j;i<=n;i=j+1){
j=n/(n/i),w[++m]=n/i;
w[m]<=sqr?id1[w[m]]=m:id2[n/w[m]]=m;
g[m]=calc(w[m])-1,h[m]=w[m]-1;
}
fp(j,1,tot)for(R int i=1;1ll*p[j]*p[j]<=w[i];++i){
id=(w[i]/p[j]<=sqr)?id1[w[i]/p[j]]:id2[n/(w[i]/p[j])];
g[i]-=pw[j]*(g[id]-sp[j-1]);
h[i]-=h[id]-j+1;
G[i]+=g[id]-sp[j-1];
}
for(R int i=2,j;i<=n;i=j+1){
j=n/(n/i),id=(j<=sqr)?id1[j]:id2[n/j];
now=G[id]+h[id],ans+=((Phi(n/i)<<1)-1)*(now-las),las=now;
}
printf("%u\n",ans);
return 0;
}

【51nod1847】奇怪的数学题(Min_25筛+杜教筛)的更多相关文章

  1. 51nod1847 奇怪的数学题 (Min_25筛+第二类斯特林数)

    link \(\sum_{i=1}^n\sum_{j=1}^n\mathrm{sgcd}(i,j)^k=\sum_{p=1}^ns(p)^k\sum_{i=1}^n\sum_{j=1}^n[\gcd( ...

  2. 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛

    题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\]  ...

  3. luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)

    题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...

  4. LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)

    题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^i\frac{lcm(i,j)}{gcd(i,j)}\] 答案对\(10^9+7\)取模. \(n< ...

  5. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  6. hdu6607 min25筛+杜教筛+伯努利数求k次方前缀和

    推导过程类似https://www.cnblogs.com/acjiumeng/p/9742073.html 前面部分min25筛,后面部分杜教筛,预处理min25筛需要伯努利数 //#pragma ...

  7. 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】

    题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...

  8. 【知识总结】线性筛_杜教筛_Min25筛

    首先感谢又强又嘴又可爱脸还筋道的国家集训队(Upd: WC2019 进候选队,CTS2019 不幸 rk6 退队)神仙瓜 ( jumpmelon ) 给我讲解这三种筛法~~ 由于博主的鸽子属性,这篇博 ...

  9. 莫比乌斯反演/线性筛/积性函数/杜教筛/min25筛 学习笔记

    最近重新系统地学了下这几个知识点,以前没发现他们的联系,这次总结一下. 莫比乌斯反演入门:https://blog.csdn.net/litble/article/details/72804050 线 ...

随机推荐

  1. AngularJS核心特性(四大点)

    本人刚刚接触AngularJS,还不太熟悉,就说说我目前遇到的一些注意点吧. 1.调用外来文件script文件 AngularJS核心特性一  MVC MVC设计模式 html文件 <!DOCT ...

  2. oralce 记一次 External Procedure initial connection 处理

    1 环境 oracle 11.2.0.4 RAC(2 nodes),centos 6.8,实体机 2 问题 线上环境执行一条sql sql> select ST_AsText(ST_Geomet ...

  3. c#的日志插件NLog基本使用

    本文介绍c#的日志插件NLog 安装插件 创建logger 日志级别 书写日志信息 配置 包装器 布局 安装插件 直接下载插件包 Install-Package NLog.Config 创建logge ...

  4. maven依赖的添加

      maven可是个管理jar依赖的好玩意,不用再关心导这个jar包那个jar包,这个jar包是谁家的,和谁有啥关系.有了maven,简简单单就搞定,下面以eclipse为例,在一个springboo ...

  5. vue中父子组件传递信息实现

    为了能够在父子组件中实现双向控制,需要以下的步骤: 第一步:子组件中挖坑 (1)在需要父组件填充具体内容的地方挖坑,方式为 <slot name="message">& ...

  6. 如何修改AWR的retention,interval

    检查AWR当前设置: SQL> select * from dba_hist_wr_control; DBID SNAP_INTERVAL RETENTION TOPNSQL --------- ...

  7. JVM中存储类信息的三个表格

    摘自:<Java Performance>第三章 Internal Class Loading Data The HotSpot VM maintains three hash table ...

  8. java 多线程系列---JUC原子类(二)之AtomicLong原子类

    概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍. AtomicLong ...

  9. WebRTC的拥塞控制技术<转>

    转载地址:http://www.jianshu.com/p/9061b6d0a901 1. 概述 对于共享网络资源的各类应用来说,拥塞控制技术的使用有利于提高带宽利用率,同时也使得终端用户在使用网络时 ...

  10. 【转载】eclipse如何传递main参数

    转自:http://blog.csdn.net/theblackbeard/article/details/52172048 在命令行窗口可以通过java +程序名 +参数1(空格)参数2(空格).. ...