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

题目:

题解:

$f_0(n) = 2^{n的不同质因子的个数}$

$ f_r(n) = \sum_{d|n}f_{r-1}(d)$

$f_0$是积性函数 , $f_r = f_0 * Id^r (1) $也是积性函数 , 所以只需要求$f_r(p^k)$就行了

$f_r(p^k)$与p无关 , $f_0(p^k)$=1+(k!=0) , $f_r(p^k)$=$\sum_{0<=i<=k}$ $ f_{r-1}(p^i)$

先递推出所有 (r,k) 的函数值, 每个询问只要分解质因数即可

时间复杂度: O((r + q) logn)

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll; const int N=1e6+;
const int M=;
const int mod=1e9+;
int q,r,n,tot;
int prime[N],vis[N];
ll f[N][];
inline int read()
{
char ch=getchar();
int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void get_prime()
{
for (int i=;i<=N;i++)
{
if (!vis[i]) prime[++tot]=i;
for (int j=;j<=tot&&prime[j]*i<=N;j++)
{
vis[prime[j]*i]=;
if (i%prime[j]==) break;
}
}
}
void pre()
{
f[][]=;
for (int i=;i<=M;i++) f[][i]=;
for (int i=;i<=N;i++)
{
ll sum=;
for (int j=;j<=M;j++)
{
sum+=f[i-][j];
f[i][j]=(f[i][j]+sum)%mod;
}
}
}
int main()
{
get_prime();
pre();
q=read();
while (q--)
{
r=read();n=read();
ll ans=;
for (int i=;i<=tot&&prime[i]<=sqrt(n);i++)
{
if (n%prime[i]) continue;
int num=;
while (n%prime[i]==) n/=prime[i],num++;
ans=1ll*ans*f[r][num]%mod;
}
if (n>) ans=1ll*ans*f[r][]%mod;
printf("%I64d\n",ans);
}
return ;
}

最新文章

  1. jQuery插件:jqGrid引入及基本属性
  2. paper 126:[转载] 机器学习中的范数规则化之(一)L0、L1与L2范数
  3. 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制
  4. DOM_节点层次
  5. SQL server 常见用法记录
  6. linux modelsim multicore(multithread)
  7. webpack入门学习
  8. type和create type
  9. sql取整函数
  10. Java Web开发: Tomcat中部署项目的三种方法
  11. 转:Jmeter进行分布式性能测试
  12. ThinkPhp框架:有条件的数据库查询、tp框架的其他知识
  13. windows下pip安装python模块时报错
  14. java8 - IO
  15. LindAgile.SchedulingTask~设计一个不错的任务调度组件
  16. 自定义Section
  17. 虚拟机iso整理
  18. 486A
  19. System.InvalidOperationException:“线程间操作无效: 从不是创建控件“btnSearch”的线程访问它。
  20. Microsoft SQL - 指令

热门文章

  1. 【JavaEE WEB 开发】Tomcat 具体解释 Servlet 入门
  2. 第二次phython作业
  3. log4j.xml打印日志信息(2)
  4. OSGi 和 C++
  5. R学习小计
  6. (转载) 据说年薪30万的Android程序员必须知道的
  7. Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法
  8. bat脚本启动exe并打开文件后退出 + 中文乱码
  9. lftp简单使用
  10. 优动漫PAINT简简单单绘画绣球花