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_k=\mathtt f_{k-1}*\mathtt {Id_0}
\]

因为\(\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\)个板子,板子之间可以没有物品的方案数,其中物品无序,板子有序(因为每次只能从后往前放置)

根据插板法强制钦定板子的物品,可以得到

\[\mathtt f_k(p^c)=\binom{c+k+1}{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 「数学」约数个数和 解题报告的更多相关文章

  1. P4714 「数学」约数个数和

    题解: 会了Miller-Rabin这题就很简单了 首先这种题很容易想到质因数分解 但是暴力根号算法是不行的 所以要用到 Miller-Rabin素数 https://blog.csdn.net/lt ...

  2. luogu 6月月赛 E 「数学」约数个数和

    题面在这里! 第一眼感觉炒鸡水啊...只要把N质因数分解一下,因为k次约数相当于求k+2元一次方程的非负整数解,所以答案就是和每个质因子指数有关的一些组合数乘起来. 但是要用pillard's rho ...

  3. 【LGP4714】「数学」约数个数和

    题目 众所周知,除数个数函数\(\sigma_0=I^2\),\(I\)就是狄利克雷卷积里的\(1\)函数 于是熟悉狄利克雷卷积的话很快就能看出我们要求的就是\(I\times I^{k}\),即\( ...

  4. 洛谷 P4710 「物理」平抛运动

    洛谷 P4710 「物理」平抛运动 洛谷传送门 题目描述 小 F 回到班上,面对自己 28 / 110 的物理,感觉非常凉凉.他准备从最基础的力学学起. 如图,一个可以视为质点的小球在点 A(x_0, ...

  5. 洛谷比赛 「EZEC」 Round 4

    洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...

  6. 题解-洛谷P6788 「EZEC-3」四月樱花

    题面 洛谷P6788 「EZEC-3」四月樱花 给定 \(n,p\),求: \[ans=\left(\prod_{x=1}^n\prod_{y|x}\frac{y^{d(y)}}{\prod_{z|y ...

  7. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  8. 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)

    洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...

  9. 洛谷 P7360 -「JZOI-1」红包(Min-Max 容斥+推式子)

    洛谷题面传送门 hot tea. 首先注意到这个 \(\text{lcm}\) 特别棘手,并且这里的 \(k\) 大得离谱,我们也没办法直接枚举每个质因子的贡献来计算答案.不过考虑到如果我们把这里的 ...

随机推荐

  1. MySQL 笔记整理(14) --count(*)这么慢,我该怎么办?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 14) --count(*)这么慢,我该怎么办? 有时你会发现,随着系统 ...

  2. mybatis bug之org.apache.ibatis.exceptions.PersistenceException:

    详细报错信息: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java. ...

  3. Vue.js实现注册功能

    编写html,通过vue-resource.js库向后台提交数据 <!DOCTYPE html> <html lang="en"> <head> ...

  4. GDAL坐标转换

    一.引言 最近研究了一下GIS.测绘学的坐标转换的问题,感觉大部分资料专业性太强,上来就是一通专业性论述:但感觉对于相关从业者来说,其实不必了解那么多背景知识的:就通过GDAL这个工具,来简单总结下坐 ...

  5. VS fopen sprinft ... unsafe 问题

    我的用的是VS2017 VS项目->右键属性(最下面)->C/C++->预处理器->预处理器定义->编辑->加上_CRT_SECURE_NO_WARNINGS  - ...

  6. 业务与IT技术

    最近听一个同事又再次提问关于业务比技术重要,是真的吗? 今天我们再来看一下.      一,什么是业务? 业务意指某种有目的的工作或工作项目.技术可以指人类对机器.硬件或人造器皿的运用,但它也可以包含 ...

  7. (办公)工作中的编码不良习惯Java(不定时更新)

    1.别瞎写,方法里能用封装好的类,就别自己写HashMap. 2.方法名,整的方法名都是啥?退出close,用out. 3.git提交版本,自己写的代码,注释,提交版本的时候,一定要清理掉.每个判断能 ...

  8. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  9. rabbitmq之基本原理及搭建单机环境

    1.RabbitMQ基本原理 1.MQ全称Message Queue,是一种分布式应用程序的通信方法,是消费-生产者模型的典型代表,producer向消息队列中不断写入消息,而另一端consumer则 ...

  10. logback日志框架的简单使用

    1.首先在maven中增加依赖 <dependency> <groupId>ch.qos.logback</groupId> <artifactId>l ...