【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)
【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)
题面
\]
其中\(sgcd\)表示次大公约数。
题解
明摆着\(sgcd\)就是在\(gcd\)的基础上除掉\(gcd\)的最小因数。
所以直接枚举\(gcd\)。
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(x)=1\)带进去就得到了:
\]
行,来筛\(f\)前缀和,涉及到了最小质因子???\(min\_25\)筛。
考虑一下\(f\)的前缀和是什么东西,首先所有质数的贡献都是\(1\),这里需要计算质数个数。
然后就是枚举最小质因子求剩下部分的\(k\)次幂的和就行了。
而很有趣的一点就是\(f\)所要求的所有合数的贡献,恰好就是计算所有质数\(k\)次方贡献时减去的部分。所以直接加上就好啦。
然后这里涉及到了自然数幂和的问题。推导戳这里
\]
这样一来就可以直接算啦。
#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筛,第二类斯特林数)的更多相关文章
- 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛
题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...
- 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛
题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\] ...
- LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)
题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^i\frac{lcm(i,j)}{gcd(i,j)}\] 答案对\(10^9+7\)取模. \(n< ...
- 51nod 1220 约数之和【莫比乌斯反演+杜教筛】
首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...
- luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...
- [51nod 1847]奇怪的数学题
[ 51nod 1847 ]奇怪的数学题 题目 点这里看题目. 分析 是挺奇怪的...... 以下定义质数集合为\(P\),\(p_i\)为第\(i\)个质数. 定义\(mp(x)\) ...
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛
题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
随机推荐
- jQuery checkbox全选 和全部取消
1.chkAll选中,全部chk选中 ,chkAll取消选中,全部chk取消选中 //chkAll选中,全部chk选中 ,chkAll取消选中,全部chk取消选中 $("#chkAll&q ...
- [Oracle]Oracle Fail Safe 与 SQLNET.AUTHENTICATION_SERVICES关系
现象: 在使用 OFS (Oracle Fail Safe)的环境中,把数据库的 SQLNET.AUTHENTICATION_SERVICES 从 NTS 改为 NONE之后,当从 Oracle Fa ...
- Ext.js Combobox 输入模糊匹配
前台页面 aspx: 数据源: <ext:Store ID="storeJF" runat="server" AutoLoad="true&qu ...
- 【强化学习】python 实现 q-learning 迷宫通用模板
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10145797.html 0.说明 这里提供了二维迷宫问题的一个比较通用的模板,拿到后需要修改 ...
- 以英雄联盟的方式建模,谈对依赖注入(DI)的理解以及Autofac的用法(一)
一.前言 近期在探索分层架构和架构设计,选择了领域驱动作为5年.Net开发后的新的方向,不可避免的接触了IoC/DI方面的技术.目前通过反射或其他方法都已实现,但只知其一,并没有考虑为什么要这么做,同 ...
- Shell编程基础篇-上
1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚 ...
- Flask_admin 笔记六 modelView的内置方法
增加model后端Flask-Admin对与之配合的数据库模型做了一些假设. 如果要实现自己的数据库后端,并且Flask-Admin的模型视图仍可按预期工作,则应注意以下事项:1) 每一个model必 ...
- C#_反射机制
一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Sys ...
- Linux下批量ping某个网段ip的脚本
比如现在需要对172.16.50.0/24网段的ip进行检查,检查哪些ip现在被占用,哪些ip没有被占用,可以通过ping命令来检查,脚本如下: [root@uatdns01 opt]# vim /o ...
- C_数据结构_链式二叉树
# include <stdio.h> # include <malloc.h> struct BTNode { int data; struct BTNode * pLchi ...