【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)

题面

51NOD

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

其中\(sgcd\)表示次大公约数。

题解

明摆着\(sgcd\)就是在\(gcd\)的基础上除掉\(gcd\)的最小因数。

所以直接枚举\(gcd\)。

\[\begin{aligned}
ans&=\sum_{i=1}^n\sum_{j=1}^n sgcd(i,j)^k\\
&=\sum_{i=1}^n\sum_{j=1}^n (\frac{gcd(i,j)}{min_p(gcd(i,j))})^k\\
&=\sum_{d=1}^n (\frac{d}{min_p(d)})^k\sum_{i=1}^n\sum_{j=1}^n [gcd(i,j)=1]\\
&=\sum_{d=1}^n (\frac{d}{min_p(d)})^k\sum_{i=1}^{n/d}\mu(i)[\frac{n}{id}]^2\\
&=\sum_{T=1}^n [\frac{n}{T}]^2\sum_{d|T}(\frac{d}{min_p(d)})^k\mu(\frac{T}{d})
\end{aligned}\]

好啦好啦,又有一个看起来要求前缀和的狄利克雷卷积啦。

令\(\displaystyle f(d)=(\frac{d}{min_p(d)})^k\)

那么后面那个东西就是\((f*\mu)(T)\)

要求它的前缀和,emmmm,杜教筛。

看到\(\mu\),emmm,构造\(g(x)=1\)

那么令\(\displaystyle S(n)=\sum_{i=1}^n (f*\mu)(i)\)

那么套杜教筛的式子:

\[g(1)S(n)=\sum_{i=1}^n (f*\mu*g)(i)-\sum_{i=2}^n g(i)S([\frac{n}{i}])
\]

把\(g(x)=1\)带进去就得到了:

\[S(n)=\sum_{i=1}^n f(i)-\sum_{i=2}^nS([\frac{n}{i}])
\]

行,来筛\(f\)前缀和,涉及到了最小质因子???\(min\_25\)筛。

考虑一下\(f\)的前缀和是什么东西,首先所有质数的贡献都是\(1\),这里需要计算质数个数。

然后就是枚举最小质因子求剩下部分的\(k\)次幂的和就行了。

而很有趣的一点就是\(f\)所要求的所有合数的贡献,恰好就是计算所有质数\(k\)次方贡献时减去的部分。所以直接加上就好啦。

然后这里涉及到了自然数幂和的问题。推导戳这里

\[\sum_{i=1}^n i^k=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\frac{(n+1)^{\underline {j+1}}}{j+1}
\]

这样一来就可以直接算啦。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define uint unsigned int
#define MAX 100000
uint n,blk;int k;
bool zs[MAX];
int pri[MAX],tot;
uint prik[MAX],sprik[MAX];
uint w[MAX],g[MAX],h[MAX],f[MAX];
int id1[MAX],id2[MAX],m;
uint S[60][60];
int getid(uint x){return (x<=blk)?id1[x]:id2[n/x];}
uint fpow(uint a,int b)
{
uint s=1;
while(b){if(b&1)s*=a;a*=a;b>>=1;}
return s;
}
void pre(int n)
{
for(int i=2;i<=n;++i)
{
if(!zs[i])pri[++tot]=i,prik[tot]=fpow(i,k);
for(int j=1;j<=tot&&i*pri[j]<=n;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j]==0)break;
}
}
for(int i=1;i<=tot;++i)sprik[i]=sprik[i-1]+prik[i];
}
uint Sumk(int n)
{
uint ret=0;
for(int i=1;i<=k;++i)
{
uint s=1;
for(int j=0;j<=i;++j)
if((n+1-j)%(i+1))s*=n+1-j;
else s*=(n+1-j)/(i+1);
ret+=S[k][i]*s;
}
return ret;
}
bool vis[MAX];
uint M[MAX];
uint Solve(uint n)
{
if(vis[getid(n)])return M[getid(n)];
uint ret=f[getid(n)];
for(uint i=2,j;i<=n;i=j+1)
j=n/(n/i),ret-=(j-i+1)*Solve(n/i);
vis[getid(n)]=true;return M[getid(n)]=ret;
}
int main()
{
scanf("%u%d",&n,&k);pre(blk=sqrt(n));S[0][0]=1;
for(int i=1;i<=k;++i)
for(int j=1;j<=i;++j)
S[i][j]=S[i-1][j-1]+j*S[i-1][j];
for(uint i=1,j;i<=n;i=j+1)
{
j=n/(n/i);w[++m]=n/i;
g[m]=w[m]-1;h[m]=Sumk(w[m])-1;
if(w[m]<=blk)id1[w[m]]=m;
else id2[n/w[m]]=m;
}
for(int j=1;j<=tot;++j)
for(int i=1;i<=m&&1u*pri[j]*pri[j]<=w[i];++i)
{
int k=getid(w[i]/pri[j]);
g[i]-=g[k]-(j-1);
h[i]-=prik[j]*(h[k]-sprik[j-1]);
f[i]+=h[k]-sprik[j-1];
}
for(int i=1;i<=m;++i)f[i]+=g[i];
uint ans=0;
for(uint i=1,j,lt=0,nw;i<=n;i=j+1)
{
j=n/(n/i);uint s=n/i;s*=s;
nw=Solve(j);ans+=s*(nw-lt);lt=nw;
}
printf("%u\n",ans);
return 0;
}

【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)的更多相关文章

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

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

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

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

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

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

  4. 51nod 1220 约数之和【莫比乌斯反演+杜教筛】

    首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...

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

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

  6. [51nod 1847]奇怪的数学题

    [ 51nod 1847 ]奇怪的数学题 题目   点这里看题目. 分析   是挺奇怪的......   以下定义质数集合为\(P\),\(p_i\)为第\(i\)个质数.   定义\(mp(x)\) ...

  7. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  8. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  9. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

随机推荐

  1. React-Route的属性exact

    exact是Route下的一条属性,一般而言,react路由会匹配所有匹配到的路由组价,exact能够使得路由的匹配更严格一些. exact的值为bool型,为true是表示严格匹配,为false时为 ...

  2. spring boot + dubbo开发遇到过的异常

    异常信息 NoClassDefFoundErrororg.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1162) Sessio ...

  3. 2016.3.30 OneZero站立会议

    会议时间:2016年3月30日  13:00~13:20 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会议内容或分配下一步任务. 会议内容: 1.汇报头一天工作情 ...

  4. linux及安全第三周总结——跟踪分析LINUX内核的启动过程

    linux内核目录结构 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一 ...

  5. LINUX内核分析第六周学习总结——进程的描述与创建

    LINUX内核分析第六周学习总结--进程的描述与创建 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc ...

  6. Python学习笔记(三)——条件语句、循环语句

    注:需注意代码的缩进格式 注:需注意代码的缩进格式 注:需注意代码的缩进格式 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断.pyth ...

  7. (Alpha)Let's-M1后分析报告

    Chronos团队Let's项目 Postmortem结果 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 在最初的用户需求和市场调研方面,团队进 ...

  8. R和python语言如何求平均值,中位数和众数

    均值是通过取数值的总和并除以数据序列中的值的数量来计算. R语言平均值公式: mean(x, trim = 0, na.rm = FALSE, ...)#x - 是输入向量.trim - 用于从排序的 ...

  9. 传参在mybatis的sql映射文件中正确获取

    1.单个参数: 非自定义对象 传参:getStuById(Integer id): 取值:#{id} 单个基本类型参数,随便取值都行:#{ok} 对象: 传参:saveStudent(Student ...

  10. CSS里Postion几个取值relative、absolute、static、fixed的区别和用法

    ---恢复内容开始--- static:静态定位,也是postion的默认值,没有定位,元素出现在正常的流中,忽略top\bottom\left\right或者z-index声明. relative: ...