题目:http://codeforces.com/contest/757/problem/E

f0[n]=2^m,其中m是n的质因子个数(种类数)。大概是一种质因数只能放在 d 或 n/d 两者之一。

然后应该发现因为 f0 是积性的,所以 fr 也是积性的!因为是卷积得来的。

这样就能把每个质因数分开。对于每种质因数考虑 fr 的转移,则 f [ r ][ p^k ] = sigma(i:0~k) ( f [ r-1 ][ p^i ] ) 。

应该发现 f0 里每种质因数的值只和其次数有关,从转移可得出 f [ k ] 里的各种质因数的值也只和其次数有关!所以 dp 状态里只要记录次数就行。

学习到了质因数分解的更好而同样简单的方法。就是预处理mindiv,然后每次除以自己的mindiv。

先写了自己的原始方法,T了;于是怒写了个pollar rho,结果T得更快,难道是写错了?

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e6,M=,mod=1e9+;
int q,r,n,dp[N+][M+],s[M+],ans,mindiv[N+],cnt,pri[N+];
bool vis[N+];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void upd(int &x){x-=(x>=mod?mod:);}
void init()
{
mindiv[]=;//
for(int i=;i<=N;i++)
{
if(!vis[i])pri[++cnt]=i,mindiv[i]=i;
for(int j=;j<=cnt&&(ll)i*pri[j]<=N;j++)
{
int d=i*pri[j];
vis[d]=; mindiv[d]=pri[j];
if(i%pri[j]==)break;
}
}
}
int pw(int x,int k,int md)
{
int ret=;while(k){if(k&)ret=(ll)ret*x%md;x=(ll)x*x%md;k>>=;}return ret;
}
bool MR(int x)
{
if(x==)return true;
int s=,u=x-,t=;
while((u&)==)u>>=,t++;
while(s--)
{
int a=rand()%(x-)+;//2~x-1
a=pw(a,u,x);
for(int i=,d;i<=t;i++)
{
d=(ll)a*a%x;
if(d==&&a!=&&a!=x-)return false;
a=d;
}
if(a!=)return false;
}
return true;
}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int Pl_rho(int x,int c)
{
int x0=rand()%x,y=x,t=,k=;
while()
{
x0=((ll)x0*x0+c)%(x+);
int g=gcd(abs(x0-y),x);
if(g!=&&g!=x)return g;
if(x0==y)return x;
if(++k==t)t<<=,y=x0;
}
}
void fd_fc(int x)
{
if(x<)return;
if(MR(x))
{
int ret=;
while(n%x==)n/=x,ret++;
ans=(ll)ans*dp[r][ret]%mod;
return;
}
int p=x;
while(p==x)p=Pl_rho(p,rand()%(x-)+);//1~x-1
fd_fc(p); fd_fc(x/p);
}
int main()
{
dp[][]=;s[]=; init();
for(int i=;i<=M;i++)dp[][i]=,s[i]=s[i-]+;
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)
dp[i][j]=s[j],s[j]=s[j-]+dp[i][j],upd(s[j]);
q=rdn();
while(q--)
{
r=rdn(); n=rdn(); ans=;
//fd_fc(n);
while(n!=)
{
int i=mindiv[n],d=;
while(n%i==)n/=i,d++;
ans=(ll)ans*dp[r][d]%mod;
}
/*
for(int i=mindiv[n],d;(ll)i*i<=n;i++)
if(n%i==0)
{
d=0;
while(n%i==0)d++,n/=i;
ans=(ll)ans*dp[r][d]%mod;
}
if(n>1)ans=(ll)ans*dp[r][1]%mod;
*/
printf("%d\n",ans);
}
return ;
}

CF 757E Bash Plays with Functions——积性函数+dp+质因数分解的更多相关文章

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

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

  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. Codeforces E. Bash Plays with Functions(积性函数DP)

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

  4. 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 ...

  5. Makoto and a Blackboard CodeForces - 1097D (积性函数dp)

    大意: 初始一个数字$n$, 每次操作随机变为$n$的一个因子, 求$k$次操作后的期望值. 设$n$经过$k$次操作后期望为$f_k(n)$. 就有$f_0(n)=n$, $f_k(n)=\frac ...

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

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

  7. D. Makoto and a Blackboard(积性函数+DP)

    题目链接:http://codeforces.com/contest/1097/problem/D 题目大意:给你n和k,每一次可以选取n的因子代替n,然后问你k次操作之后,每个因子的期望. 具体思路 ...

  8. Problem : 这个题如果不是签到题 Asm.Def就女装(积性函数dp

    https://oj.neu.edu.cn/problem/1460 思路:若n=(p1^a1)*(p2^a2)...(pn^an),则f(n,0)=a1*a2*...*an,显然f(n,0)是积性函 ...

  9. 【codeforces 757E】Bash Plays with Functions

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

随机推荐

  1. [学习笔记]Java异常机制

    概述 异常 程序在执行时出现的不正常情况,是对问题的描写叙述.将问题进行对象的封装. Java中的异常,就是对不正常情况进行描写叙述后的对象体现. 异常体系 Throwable     |--Erro ...

  2. js动态函数

    最近项目中使用百度模板引擎baiduTemplate.js,使用动态函数解析模板中代码. 通过new Function([arg1,arg2,...,argN,]functionBody)方式实现动态 ...

  3. UVA 11578 - Situp Benches(dp)

    题目链接:11578 - Situp Benches 题意:健♂身♂房有两个仰卧起坐坐垫,每次调整角度要花费10元/10度,每次使用要花费15,如今给定n个人的时间顺序,和所希望的角度,求最少花费 思 ...

  4. CSS3中的动画效果-------Day72

    还记得么,在前面也曾实现过"仅仅用css让div动起来",还记得当时是怎么实现的么,是的,transition,针对的也比較局限,仅仅有旋转角度啊,长宽啊之类的,所以说,与其说是动 ...

  5. windows平台简易直播系统搭建

    最近做直播系统的朋友很多,正好前端时间也在做这一块,写片文章分享下开发心得,以为后用. 直播系统我将它分为前堆推流,后台服务,客户端播放三大部分.前端推流基于ffmpeg,后台服务 使用crtmp服务 ...

  6. VM不能ping通www.baidu.com的问题【NAT】 更新了【桥接模式】

    NAT模式 1.为NAT设置子网及掩码等信息 点击VMWare菜单栏“编辑” —> 虚拟网络编辑器 [下图第一张图]—> 选中VMnet8(当然这个看自己的设备后缀是多少了,只要外部连接方 ...

  7. [框架安装趟雷指南]Ubuntu+1060+cuda+cudnn+Keras+TH+TF+MXnet

    [框架安装趟雷指南]Ubuntu+1060+cuda+cudnn+Keras+TH+TF+MXnet https://zhuanlan.zhihu.com/p/23480983 天清 9 个月前 写这 ...

  8. MVC准备工作

    准备工作 打开VS创建一个ASP.NET MVC空项目,在http://www.asp.net/mvc/overview/getting-started/introduction/getting-st ...

  9. Finder 快捷键

    记录几个常用的 Finder 快捷键: 复制 Finder 里选中的路径:option+cmd+c 地址栏跳到指定路径:shift+cmd+g 增加标签:cmd+t 显示/隐藏 标签栏:shift+c ...

  10. Html.DropDownListFor的选项值为字符型问题

    我快要疯了.asp.net mvc的这个DropDownListFor,无论在服务器端如何设置,设置哪个值被选中,结果到了页面输出,选中值根本没有被选中,没有任何一个值被选中,下拉框只冷冰冰地显示一个 ...