洛谷 P4714 「数学」约数个数和 解题报告
P4714 「数学」约数个数和
题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点都有自环)
这样想是做不出来题的。
正常的题意是:询问\(n\)的约数的约数的....(共\(k\)次复读后)约数个数和。
考虑\(f_k(n)\)表示答案。
显然有\(f_{k}(n)=\sum_{d|n}f_{k-1}(d)\)
注意到用数论卷积的形式可以表示为
\]
因为\(\mathtt f_0=\mathtt d\),即约数个数,又因为积性函数乘积性函数为积性函数
所以\(\mathtt f_k\)是积性函数。
考虑求\(\mathtt f_k(p^c)\)
我们有\(\mathtt f_k(p^c)=\sum_{i=0}^cf_{k-1}(p^i)\)
我们注意到每次\(k-1\),实际上是对\(p\)有一个划分,我们可以形象的理解为,\(c\)个物品,中间插\(k+1\)个板子,板子之间可以没有物品的方案数,其中物品无序,板子有序(因为每次只能从后往前放置)
根据插板法强制钦定板子的物品,可以得到
\]
这个\(c\)很小,直接算算就可以了。
分解大数可以直接使用Pollard_Rho算法
Code:
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <algorithm>
#define ll long long
using std::min;
const int SIZE=1<<21;
char ibuf[SIZE],*iS=ibuf,*iT=ibuf;
//#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),iS==iT?EOF:*iS++):*iT++)
#define gc() getchar()
template <class T>
void read(T &x)
{
x=0;char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)) x=x*10+c-'0',c=gc();
}
const int pri[]={2,3,5,7,11,13,17,19,23,29,31,37};
void add(ll &a,ll b,ll p){a=a+b>=p?a+b-p:a+b;}
ll mul(ll d,ll k,ll p)
{
ll f=0;
while(k)
{
if(k&1) add(f,d,p);
add(d,d,p);
k>>=1;
}
return f;
}
ll qp(ll d,ll k,ll p)
{
ll f=1;
while(k)
{
if(k&1) f=mul(f,d,p);
d=mul(d,d,p);
k>>=1;
}
return f;
}
bool Miller_Rabin(ll n)
{
if(n==1) return false;
for(int i=0;i<12;i++) if(n%pri[i]==0) return n==pri[i];
ll res=n-1;int k=0;
while(!(res&1)) res>>=1,++k;
for(int i=0;i<12;i++)
{
ll x=qp(pri[i],res,n);
for(int j=0;j<k&&x>1;j++)
{
ll y=mul(x,x,n);
if(y==1&&x!=n-1) return false;
x=y;
}
if(x!=1) return false;
}
return true;
}
ll F(ll x,ll c,ll p) {return (mul(x,x,p)+c)%p;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll Find(ll n)
{
ll x,y=rand()%n,c=rand()%n;
int w=1<<9;
for(int l=1;;l<<=1)
{
x=y;
for(int i=0;i<l;i++) y=F(y,c,n);
for(int i=0;i<l;i++)
{
int le=min(l-i,w);
ll g=1,las=y;
for(int j=0;j<le;j++) y=F(y,c,n),g=mul(g,(y+n-x)%n,n);
g=gcd(g,n);
if(g==1) continue;
if(g==n)
{
g=1,y=las;
while(g==1) y=F(y,c,n),g=gcd((y+n-x)%n,n);
}
return g;
}
}
}
ll s[1<<19],n,k,ans=1;
int tot;
void Pollard_Rho(ll n)
{
if(n==1) return;
if(Miller_Rabin(n)) {s[++tot]=n;return;}
ll d=Find(n);
while(d==n) d=Find(n);
Pollard_Rho(d),Pollard_Rho(n/d);
}
const ll mod=998244353;
ll C(ll m,ll n)
{
ll f=1;
for(ll i=1;i<=n;i++) f=mul(f,i,mod);
f=qp(f,mod-2,mod);
for(ll i=m;i>m-n;i--) f=mul(f,i,mod);
return f;
}
int main()
{
read(n),read(k);
Pollard_Rho(n);
std::sort(s+1,s+1+tot);
tot=std::unique(s+1,s+1+tot)-s-1;
for(int i=1;i<=tot;i++)
{
ll c=0;
while(n%s[i]==0) n/=s[i],++c;
ans=mul(ans,C(c+k+1,c),mod);
}
printf("%lld\n",ans);
return 0;
}
2019.4.29
洛谷 P4714 「数学」约数个数和 解题报告的更多相关文章
- P4714 「数学」约数个数和
题解: 会了Miller-Rabin这题就很简单了 首先这种题很容易想到质因数分解 但是暴力根号算法是不行的 所以要用到 Miller-Rabin素数 https://blog.csdn.net/lt ...
- luogu 6月月赛 E 「数学」约数个数和
题面在这里! 第一眼感觉炒鸡水啊...只要把N质因数分解一下,因为k次约数相当于求k+2元一次方程的非负整数解,所以答案就是和每个质因子指数有关的一些组合数乘起来. 但是要用pillard's rho ...
- 【LGP4714】「数学」约数个数和
题目 众所周知,除数个数函数\(\sigma_0=I^2\),\(I\)就是狄利克雷卷积里的\(1\)函数 于是熟悉狄利克雷卷积的话很快就能看出我们要求的就是\(I\times I^{k}\),即\( ...
- 洛谷 P4710 「物理」平抛运动
洛谷 P4710 「物理」平抛运动 洛谷传送门 题目描述 小 F 回到班上,面对自己 28 / 110 的物理,感觉非常凉凉.他准备从最基础的力学学起. 如图,一个可以视为质点的小球在点 A(x_0, ...
- 洛谷比赛 「EZEC」 Round 4
洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...
- 题解-洛谷P6788 「EZEC-3」四月樱花
题面 洛谷P6788 「EZEC-3」四月樱花 给定 \(n,p\),求: \[ans=\left(\prod_{x=1}^n\prod_{y|x}\frac{y^{d(y)}}{\prod_{z|y ...
- 洛谷 [SDOI2015]约数个数和 解题报告
[SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...
- 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)
洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...
- 洛谷 P7360 -「JZOI-1」红包(Min-Max 容斥+推式子)
洛谷题面传送门 hot tea. 首先注意到这个 \(\text{lcm}\) 特别棘手,并且这里的 \(k\) 大得离谱,我们也没办法直接枚举每个质因子的贡献来计算答案.不过考虑到如果我们把这里的 ...
随机推荐
- eclipse复制粘贴变卡的解决办法
参考这个:https://www.cnblogs.com/o-andy-o/p/4108955.html
- Spring Boot 入门(五):集成 AOP 进行日志管理
本篇文章是接着 Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理写的,按照前面几篇博客的教程,可以搭建一个简单的项目,主要包含了 Pagehelper+MyBatis 分页 ...
- Odoo的模块和应用程序的区别和使用
一.模块(modules)和应用程序(application)的区别: 模块元件是Odoo应用程序的组成快.模块可以将新功能添加到Odoo,或改变现有功能.模块是一个包含名为__manifest__. ...
- Webpack 4教程 - 第七部分 减少打包体积与Tree Shaking
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/08/13/webpack-4-course-part ...
- 华为6.0系统设备最完美激活Xposed框架的经验
对于喜欢玩手机的伙伴而言,经常会使用上Xposed框架及种种功能强大的模块,对于5.0以下的系统版本,只要手机能获得root权限,安装和激活Xposed框架是非常轻松的,但随着系统版本的迭代,5.0以 ...
- Glide的 java.lang.RuntimeException: Expected instanceof GlideModule, but found:X.GlideModule@2e4554f
问题一 在添加过混淆规则后,App打包的时候,发现报错了 java.lang.RuntimeException: Expected instanceof GlideModule, but found: ...
- 十款 Chrome 扩展工具,提高前端编码效率
1. 掘金 Chrome 插件 对于开发者来说,比开发过程更重要的,应该要算平时对于开发资源以及技术文章一点一滴的积累了吧.那么,开发者能够在哪里获取需要的技术内容呢?过去,你可能需要在 GitHub ...
- CTF杂项之BubbleBabble加密算法
这题很坑,刚开始我拿到就分析不出来了(/无奈),关键是不知道是什么加密算法,后来看题目描述的bubble,猜测是bubble 这种算法(听都没听说过...) 上图 这串编码 xinik-samak-l ...
- svn上传*.so文件
做移动开发,android里面需要用到第三方类库,设计"*.so"文件. svn无法提交,Eclipse里面的svn视图里面该文档无版本图标. 原因描述:svn忽略某些扩展名的文件 ...
- Linux、CentOS7下报错-bash: TMOUT: readonly variable怎么办?
一.Linux操作系统版本 二.背景:在项目中当我们配置好JDK环境变量.Tomcat环境变量,通过source /etc/profile使环境变量生效时,发现会报错,如图 三.解决 个人尚不知出现原 ...