题解

q<=1e6,询问非常多。而n,r也很大,必须要预处理所有的答案,询问的时候,能比较快速地查询。

离线也是没有什么意义的,因为必须递推。

先翻译$f_0(n)$

$f_0(n)=\sum_d|n[(d,\frac{n}{d})=1]$

一个数的约数和约数的另一半互质,那么,必须意味着,对于n的每个质因子,要么全在d,要么全在n/d否则就不互质了,就是0

对于互质时,每个质因子有两种选择情况,

所以,f0就是$2^m$其中,m是n的质因子种类数。

然后还要处理fr的递推式。

发现,还是和n的约数有关,反过来考虑每个约数的贡献,发现每个约数会被计算两次,u,v各一次

而还要除以2,正好消掉

那么,其实$f_r(n)=\sum_{d|n}f_{r-1}(d)$

这个是什么呢?$f_r(n)=f_{r-1}*1$($*$表示卷积)

$f_0$是积性函数显然,

而卷积两侧是积性函数,那么卷积之后也是积性函数的。

所以,递推过去,$f_r$都是积性函数了。

所以,处理$f_r$可以把每个质因子分开考虑。

$f_r(n)=\Pi_{i=1}^k\space f_{r-1}(p_i^{q_i})$

$f_r(p_1^{q_1})=\sum_{d|{p_1^{q_1}}}f_{r-1}(d)=\sum_{k=1}^{q_1}f_{r-1}(p_1^{k})$

可以发现,如果递推到$f_0$的话,那么,就和质因子p1是什么,没有任何关系了。

所以,之后的取值,和p1是什么质因子,也没有关系。

只和p1的次数有关。

所以可以dp[i][j]第i层,次数为j的$f_i(j)$的值。

前缀和优化一下即可。

但是对于1e6次输入的数,怎么快速质因数分解呢?

假装你要线性筛素数,然后你可以顺便筛出mindiv(一个数的最小质因子)

然后,可以每次除掉mindiv,记录一下这个mindiv的次数。

即可利用mindiv,logn质因数分解

代码:

#include<bits/stdc++.h>
#define numb (ch^'0')
#define ri register int
using namespace std;
typedef long long ll;
const int N=+;
const int mod=1e9+;
int q,r,n;
int pri[N],cnt;
int mindiv[N];
ll f[N][],sum[];
bool vis[N];
void rd(int &x){
x=;char ch;
while(!isdigit(ch=getchar()));
for(x=numb;isdigit(ch=getchar());x=(x<<)+(x<<)+numb);
}
void sieve(){
mindiv[]=;//warning!!
for(int i=;i<=N-;i++){
if(!vis[i]){
pri[++cnt]=i;
mindiv[i]=i;
}
for(int j=;j<=cnt;j++){
if(pri[j]*i>N-) break;
vis[pri[j]*i]=;
mindiv[pri[j]*i]=pri[j];
if(i%pri[j]==) break;
}
}
}
int main(){
sieve();
f[][]=;
sum[]=;
for(int i=;i<=;i++) f[][i]=,sum[i]=sum[i-]+f[][i];
for(ri i=;i<=N-;i++){
for(int j=;j<=;j++){
f[i][j]=sum[j];
sum[j]=;
if(j)sum[j]=sum[j-];
(sum[j]+=f[i][j])%=mod;
}
}
int t;
rd(t);
while(t--){
rd(r),rd(n);
ll ans=;
while(n!=){
ll div=mindiv[n];
int cnt=;
while(mindiv[n]==div) cnt++,n/=mindiv[n];
(ans*=f[r][cnt])%=mod;
}
printf("%lld\n",ans);
}
return ;
} /*
Author: *Miracle*
Date: 2018/10/3 22:15:15
*/

总结:

1.对于1e6的询问,必然要考虑探究性质,O(1)处理询问。

2.积性函数的证明:

①从实际意义考虑,如$f_0$

②直接理性证明,如$f_r$

这个是利用了卷积的性质

有时要考虑的是分开质因子能不能处理。

CF757E Bash Plays with Functions的更多相关文章

  1. Codeforces 757 E Bash Plays with Functions

    Discription Bash got tired on his journey to become the greatest Pokemon master. So he decides to ta ...

  2. Codeforces757E.Bash Plays With Functions(积性函数 DP)

    题目链接 \(Description\) q次询问,每次给定r,n,求\(F_r(n)\). \[ f_0(n)=\sum_{u\times v=n}[(u,v)=1]\\ f_{r+1}(n)=\s ...

  3. codeforces757E. Bash Plays with Functions(狄利克雷卷积 积性函数)

    http://codeforces.com/contest/757/problem/E 题意 Sol 非常骚的一道题 首先把给的式子化一下,设$u = d$,那么$v = n / d$ $$f_r(n ...

  4. Codeforces E. Bash Plays with Functions(积性函数DP)

    链接 codeforces 题解 结论:\(f_0(n)=2^{n的质因子个数}\)= 根据性质可知\(f_0()\)是一个积性函数 对于\(f_{r+1}()\)化一下式子 对于 \[f_{r+1} ...

  5. CF 757E Bash Plays with Functions——积性函数+dp+质因数分解

    题目:http://codeforces.com/contest/757/problem/E f0[n]=2^m,其中m是n的质因子个数(种类数).大概是一种质因数只能放在 d 或 n/d 两者之一. ...

  6. CF 757 E Bash Plays with Functions —— 积性函数与质因数分解

    题目:http://codeforces.com/contest/757/problem/E 首先,f0(n)=2m,其中 m 是 n 的质因数的种类数: 而且 因为这个函数和1卷积,所以是一个积性函 ...

  7. 【codeforces 757E】Bash Plays with Functions

    [题目链接]:http://codeforces.com/problemset/problem/757/E [题意] 给你q个询问; 每个询问包含r和n; 让你输出f[r][n]; 这里f[0][n] ...

  8. [Codeforces 757E] Bash Plays with Functions (数论)

    题目链接: http://codeforces.com/contest/757/problem/E?csrf_token=f6c272cce871728ac1c239c34006ae90 题目: 题解 ...

  9. Bash Plays with Functions CodeForces - 757E (积性函数dp)

    大意: 定义函数$f_r(n)$, $f_0(n)$为pq=n且gcd(p,q)=1的有序对(p,q)个数. $r \ge 1$时, $f_r(n)=\sum\limits_{uv=n}\frac{f ...

随机推荐

  1. 设置chrome浏览器背景颜色

    经常看博客,页面背景都是白色的居多,看久了眼睛就不适合了,决定修改chrome浏览器背景颜色,保护下自己的眼睛, 下载chrome 插件Stylish并安装,安装成功后chrome右上角有它的图标,点 ...

  2. java线程介绍

    文章讲解要点 1.线程创建几种方式2.线程常见设置方法,包括优先级.优先级休眠.停止等3.多线程间的数据交互与锁机制4.项目源码下载   线程介绍.png 一.线程创建方式 常见的线程创建方法以下三种 ...

  3. Python:运算类内建函数列举

    1. divmod() python3.x版本中,整除运算用 “//”,取余可以用 “%”,在某些问题中要同时得到商和余数就需要两步运算,而使用divmod函数可以同时得到商和余数: 函数有两个参数d ...

  4. jsp用el表达式获取后台传来的值,或者获取session中的值

    <script type="text/javascript"> var usernameC = ${sessionScope.SESSION_USER_PROFILE. ...

  5. Left Jion和where区别

    首先,新建两张表A和B,然后插入6条数据到A表,3条数据到B表.语句如下: create table A( ID ,) not null, AName ) null ) create table B( ...

  6. 一天一个Linux命令--find

    文件查找:(以find为主)  which:查找命令字所在的位置  locate:模糊匹配(只要包含关键字的文件都查找出来)         不是实时的,基于数据库查找, updatedb升级loca ...

  7. Ubuntu composer 安装thinkphp5 失败,报错:[ErrorException] mkdir(): Permission denied

    在Linux环境下,使用composer安装thinkphp5,安装时,报错:[ErrorException]               mkdir(): Permission denied : 看 ...

  8. 好程序员技术教程分享JavaScript运动框架

    好程序员技术教程分享JavaScript运动框架,有需要的朋友可以参考下. JavaScript的运动,即让某元素的某些属性由一个值变到另一个值的过程.如让div的width属性由200px变到400 ...

  9. winserver的consul部署实践与.net core客户端使用(附demo源码)

    winserver的consul部署实践与.net core客户端使用(附demo源码)   前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的 ...

  10. Redis入门---字符串类型

    阅读目录 1.keys * 命令 2.判断一个键是否存在(exists key) 3.删除键 4.获取键值的数据类型 5 递增数字(incr) 6.增加指定的整数 (INCRBY) 7.减少指定的整数 ...