【题目链接】:http://codeforces.com/problemset/problem/757/E

【题意】



给你q个询问;

每个询问包含r和n;

让你输出f[r][n];

这里f[0][n]是n分解成两个数u,v的乘积的个数;

这里u和v互质;

而f[r][n]当r>0时,有个递推式;

【题解】



那个递推式等价于



即n的所有因子x的f[r][x]的和;

这里需要知道;

f[0][n]=2n的不同质因子个数

且容易得到

当a和b互质的时候,f[0][a*b]=f[0][a]*f[0][b];

则f[0]是积性函数;

有个定理就是;

如果是类似上面那个递推

如果且f为积性函数,则g也为积性函数;

则我们在算

f[r][n]的时候可以对n分解质因数;

即f[r][p1^q1*p2^q2…pm^qm];

这样p1^q1..p2^q2..pm^qm都是互质的了;

则可以利用积性函数把它们分解成

f[r][p1^q1]*f[r][p2^q2]..*f[r][pm^qm];

这里

f[0][p^q]的值除了q=0的时候为1之外,其他情况都为2,因为p是质数,可知不同的质因子个数只有1个,也即这个质数p;所以都是2^1;

q为0的时候,只有1,1这种情况,所以只有一对;为1;

(所以这里的p只要为质数,是几都无所谓,f[0]的值都一样)



根据

可知

f[r+1][pq]=∑f[r][p0..q]⋅⋅⋅①

因为p0..q都是pq的因子

这样其实就能看出来了,要算f[r][p^q]的时候,根本不需要知道p是多少;

f[r][p^q]只与q和r有关;

根据①式能够很容易写个dp;

具体的

g[0][0] = 1,g[0][1..n] = 2;

g[i][0] = g[i-1][0];

g[i][j]=∑g[i−1][0..j]

对于要算的

f[r][p1q1]∗f[r][p2q2]..∗f[r][pmqm];

直接输出

g[r][q1]∗g[r][q2]∗...∗g[r][qm]

就好;

在对n分解质因数的时候,好像用到了更牛逼的方式.

类似筛法的东西吧.

快速获取某个值的质因子;

(用cin竟然会超时…再也不用了!…还是算了吧,cin还是比较方便的,记住可能会因为这个超时就好…)



【Number Of WA】



5



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e6;
const int MOD = 1e9+7; int dp[N+100][21],lp[N+10]; void pre()
{
lp[1] = 1;
rep1(i,2,N)
if (lp[i]==0)
for (int j = i;j<=N;j+=i)
lp[j] = i; rep1(i,1,20)
dp[0][i] = 2;
rep1(i,0,N)
dp[i][0] = 1;
rep1(i,1,N)
rep1(j,1,20)
dp[i][j] = (dp[i][j-1] + dp[i-1][j])%MOD;
} int main()
{
//Open();
pre();
int q;
scanf("%d",&q);
while (q--)
{
int r,n;
scanf("%d%d",&r,&n);
LL ans = 1;
while (n>1)
{
int cnt = 0,x = lp[n];
while (n%x==0)
{
cnt++;
n/=x;
}
ans = (ans*dp[r][cnt])%MOD;
}
printf("%lld\n",ans);
}
return 0;
}

【codeforces 757E】Bash Plays with Functions的更多相关文章

  1. 【codeforces 757B】 Bash's Big Day

    time limit per test2 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...

  2. 【Codeforces 757B】 Bash's big day

    [题目链接] 点击打开链接 [算法] 若gcd(s1,s2,s3....sk) > 1, 则说明 : 一定存在一个整数d满足d|s1,d|s2,d|s3....,d|sk 因为我们要使|s|尽可 ...

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

  4. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  5. 【codeforces 789C】Functions again

    [题目链接]:http://codeforces.com/contest/789/problem/C [题意] 看式子. [题解] 考虑最后的答案区间; 如果那个区间是从奇数位置的数字开始的; 那么奇 ...

  6. 【30.49%】【codeforces 569A】Music

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. 【codeforces 757A】Gotta Catch Em' All!

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. 【codeforces 754B】 Ilya and tic-tac-toe game

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  9. 【codeforces 604D】Moodular Arithmetic

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

随机推荐

  1. 学习redis遇到的问题

    1. pipeline为什么批量执行速度会变快? 答:是因为在tcp连接中减少了交互往返的时间,因为每次执行还要返回响应值,并且是一条执行完成之后才会执行下一条,但是批量执行只需要一次往返,所以节省了 ...

  2. PHP学习总结(3)——PHP入门篇之PHP的echo语句

    Echo语句 echo是PHP中的输出语句,可以把字符串输出(字符串用双引号括起来). 如下代码: <?php echo "Hello world!";?> 注意ech ...

  3. [Web Worker] Introduce to Web Worker

    What is web worker for? OK, read it docs to get full details idea. Or just a quick intro to web work ...

  4. 安卓系统底层C语言算法之測试參数是几个long型的算法

    #include <stdio.h> #define BITS_PER_LONG (sizeof(unsigned long) * 8) //求一个数x是几个long的长度 #define ...

  5. 通过PowerShell卸载全部的SharePoint 2010 解决方式

    通过PowerShell卸载全部的SharePoint 2010 解决方式         为了演示.我常常须要拆毁再重建SharePoint 2010 环境.         我常常须要用到的操作就 ...

  6. [yueqian_scut]Android多点触控技术和应用框架

    Android多点触控技术跟Linux输入子系统紧密相关.本文将从应用的角度说明Android多点触控技术的接口和应用. 一.多点触控场景分析 网络上有关Android多点触控技术的文章多见于两点拉伸 ...

  7. ROS常用知识指南

    前言:介绍一些基础常用的知识. 一.标准单位 二.坐标表现方式 三.默认安装位置 通过apt-get安装的软件包, 默认安装位置为:/opt/ros/kinetic/share 四.软件包安装流程 4 ...

  8. [转]SQL Server 批量完整备份

    最近我们的服务器需要迁移,服务器上有很多数据库,有很多都不知道干什么的了,但是为了保险起见,我决定都备份下,起初我是右键一个一个备份的,备份三四个还好,可是数据库太多了,而且手动一步一步操作,还得修改 ...

  9. com.sun.jdi.internalException:Unexpected JDWP Error:103////Method threw 'java.lang.IllegalArgumentEx

    retrofit2+RxJava2 的一些坑 今天开发新项目,本着积极向上的学习态度,经过多番考虑我决定使用retrofit2 + RxJava2来做为我的网络请求......神说:你的想法非常好 先 ...

  10. python爬虫:爬取医药数据库drugbank

    这个是帮朋友做的,难点就是他们有一个反爬虫机制,用request一直不行,后面我就用selenium直接把网页copy下来,然后再来解析本地的html文件,就木有问题啦. 现在看来,写得有点傻,多包涵 ...